2012-10-21 3 views
5

मेरे पास मेरे सी # विनफॉर्म पर एक पैनल में टेक्स्ट बॉक्स का एक गुच्छा है। पाठ बॉक्स की प्रत्येक पंक्ति इस तरह नाम हैं:विधि कॉल करने वाले कॉलिंग (बटन) प्रेषक (बटन #) के आधार पर वे चर नामों का उपयोग कैसे कर सकते हैं?

Tb1 tbNickName1 ComboBox1
tb2 tbNickName2 comboBox2
tb3 tbNickName3 comboBox3

और इतने पर।

मेरे पास टेक्स्ट बॉक्स की प्रत्येक पंक्ति के बगल में एक बटन है। लेकिन बटन को प्रत्येक बटन के लिए एक अलग ईवेंट पर इंगित करने के बजाय, मैं बटन को बटन 1_Click ईवेंट पर इंगित करना चाहता हूं और यह वहां सभी प्रोसेसिंग कर रहा है। मुझे पता है कि यह कैसे करें और मेरे सभी बटन बटन 1_Click ईवेंट पर इंगित करें।

लेकिन मुझे यह निर्धारित करने में सक्षम होना चाहिए कि इसे किस बटन से कॉल किया गया था (जिसे मैं करने में सक्षम हूं), लेकिन मुझे घटना में टेक्स्ट बॉक्स के नाम का उपयोग करने की आवश्यकता है ताकि मैं इस पर आधारित प्रसंस्करण कर सकूं पंक्ति मैं उस बटन में हूं जिसमें से मैं कॉल कर रहा हूं।

उदाहरण के लिए, अगर मैं पंक्ति संख्या 2 में हूँ tb2 tbNickName2 comboBox2 बक्सें, तो मैं button1_Click घटना को जानते हैं और स्वचालित रूप से tmp चर है कि मैं का उपयोग करने के tb2 tbNickName2 comboBox2 मान निर्दिष्ट करने में सक्षम होने की जरूरत है कर रहे हैं जहां नीचे दिए गए उदाहरण में।

private void button1_Click(object sender, EventArgs e) 
{ 
     Button bt = (Button) sender; //will return 'button1' 

     string tmpEmail = null; 
     string tmpNickName = null; 
     string tmpGroup = null; 

     //I don't want to hard code the tb1.Text value here, I want to have 
     // the namechange based on which (Button) sender it was called from. 

     // For example button1 should assign all the 
     // tb1 tbNickName1 comboBox1 values 

     //If called from button2, then it should assign the 
     //tb2 tbNickName2 comboBox2 values instead 

     //How can I do this so tb1.Text is based off of the button # that I am 
     //calling for example tb(bt).Text would be cool but that does not work. 

     tmpEmail = tb1.Text; //What do I change tb1.Text to based on button #? 

     tmpNickName = tbNickName1.Text; //What do I change tbNickName1.Text to? 

     tmpGroup = comboBox1.Text;//What do I change comboBox1.Text to? 
} 


मुझे पता है कि मैं इस बहुत अच्छी तरह से समझाया नहीं है, लेकिन यह सबसे अच्छा मैं कर सकते हैं।

+0

उपयोग बटन के CommandArgument-संपत्ति का उपयोग करें और का मूल्यांकन है कि आपके eventhandler में कर सकते हैं की जरूरत नहीं हो सकती है। – mboldt

+0

क्या आप मुझे यह कैसे करना है इस पर एक कोड उदाहरण दिखा सकते हैं? – fraXis

+0

मैं एक छोटे कोड स्निपेट को उत्तर के रूप में पोस्ट करता हूं। – mboldt

उत्तर

1
Button button = sender as Button; 
string buttonIndex = button.Name.Substring(6); 
string tempEmail = (this.Controls["tb" + buttonIndex] as TextBox).Text; 
string tmpNickName = (this.Controls["tbNickName" + buttonIndex] as TextBox).Text; 
string tmpGroup = (this.Controls["comboBox" + buttonIndex] as ComboBox).Text; 
+0

स्ट्रिंग tempEmail = (यह। नियंत्रण ["टीबी" + बटन इंडेक्स] टेक्स्टबॉक्स के रूप में)। टेक्स्ट; एक "वस्तु संदर्भ किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं है" त्रुटि का कारण बनता है। – fraXis

+0

तो टेक्स्ट टीबी + बटन इंडेक्स के साथ टेक्स्टबॉक्स आपके WinForm – Denis

+0

में मौजूद नहीं है, मैंने त्रुटि का पता लगाया। मैंने अपने पैनल नाम को शामिल करने के लिए कोड की रेखा को बदल दिया और यह अभी ठीक काम करता है: string tempEmail = (this.panel1.Controls ["tb" + buttonIndex] टेक्स्टबॉक्स के रूप में) .क्स्ट; – fraXis

0

बटन पर, आप CommandArgument-संपत्ति जोड़ने के इस

bt1.CommandArgument = "1"; 
bt2.CommandArgument = "2"; 

की तरह कुछ दिखाई दे सकता है जो आपके eventhandler में, आप CommandArgument पढ़ सकते हैं और उसके अनुसार कार्य

private void button1_Click(object sender, EventArgs e) 
    { 
     Button bt = (Button) sender; 
     if(bt.CommandArgument == "1") { 
      // bt1 was clicked, handle stuff accordingly 
     } else if(bt.CommandArgument == "2") { 
      // bt2 was clicked.. 
     } else { 
      //handle rest of possible cases 
     } 
    } 

यह केवल छद्म कोड है, लेकिन मुझे लगता है कि आप देख सकते हैं कि यह कहां जा रहा है। हालांकि ध्यान रखें, कि आपका चर-नामकरण इष्टतम से बहुत दूर है। अपने चर और नियंत्रण के लिए नाम चुनें जो आपको संख्याओं के साथ नाम देने की बजाए किसी भी प्रकार की जानकारी देते हैं। यदि आप बाद में कोड को देखते हैं और इसे समझने की कोशिश करते हैं तो इससे आपको बहुत मदद मिलेगी। इस तरह, सार्थक CommanArgument-values ​​भी खोजने का प्रयास करें।

+0

मैं समझता हूं कि आपका क्या मतलब है, लेकिन मेरे पास इतना कोड है जो पाठ बॉक्स की प्रत्येक पंक्ति पर आधारित है जिसे मैं अपने अस्थायी चरों को असाइन करना चाहता हूं। मैं अलग-अलग/अन्य कथन के बीच में सभी डुप्लिकेट कोड रखने से बचना चाहता हूं। मैं कोड का एक सेट रखना चाहता हूं जो टेक्स्ट बटन को अस्थायी चर में निर्दिष्ट करता है कि कौन सा बटन # ईवेंट को कॉल कर रहा है। – fraXis

+0

यदि प्रत्येक मामले के लिए निष्पादित किया जाना कोड हमेशा समान होता है, तो इसे एक अलग विधि में रखें, कमांडएरगुमेंट के अनुसार अपने अस्थायी चर सेट करें और उन अस्थायी चर को अपने वास्तविक कोड को निष्पादित करने वाली विधि को पास करें। – mboldt

+0

कोड का बहुमत वैरिएबल नामों को छोड़कर वही है जो कि टेक्स्ट टेक्स्ट बॉक्स के आधार पर बदल जाएगा जो मुझे मूल्यों को असाइन करने की आवश्यकता है। यह अभी भी कई तरीकों से दोहराना कोड है और मैं बनाए रखने के लिए कुछ और अधिक कुशल और आसान प्रयास करना चाहता हूं। – fraXis

1

आप (पैनल में नियंत्रण से अधिक पुनरावृत्ति) कुछ इस तरह कर सकते हैं:

//Get the number of the button control (last digit of the name) 
    string strNum = bt.Name.Substring(bt.Name.Lenght -2); 
    foreach(Control ctrl in myPanel.Controls) 
    { 
     if(ctrl is ComboBox) { 
      if(ctrl.Name.EndsWith(strNum)) { 
      //Do Something with your found ComboBox ... 
      } 
     } 
    } 

कोड का परीक्षण नहीं किया है, लेकिन आप एक विचार देना चाहिए ...

-1

सबसे पहले, अपने खुद के लिए, हमारा, और कोई भी आपके कोड को कभी भी देख रहा है, अपना नामकरण सम्मेलन बदलें।

एक समाधान के लिए, मैं आपके चेकबॉक्स और टेक्स्ट बॉक्स में संदर्भ बनाने के लिए एक शब्दकोश में संदर्भ डालने का सुझाव दूंगा। बटन को उस कुंजी को बनाएं जिसमें आपने अपने CommandArgument में उपयोग किया था। अब आप शब्दकोश तक पहुंच कर पंक्ति को पुनः प्राप्त कर सकते हैं।

उदाहरण के लिए, अपने निर्माता में, आप कुछ इस

_rowDictionary = new Dictionary<string, Row> { 
    { "identifier of first line", new Row { descriptiveNameOfFirstTextBox, descriptiveNameOfFirstTextBox, descriptiveNameOfButton } }, 
    // ... 
}; 
descriptiveNameOfButton.CommandArgument = "identifier of first line"; 

की तरह फिर जोड़ते हैं वह आपके ईवेंट हैंडलर

यहाँ में, मैं कुछ कंटेनर वर्ग का उपयोग किया है। आप में से हो सकता है यह

class Row { 
    TextBox textBoxForInputOfA { get; set; } 
    TextBox textBoxForInputOfB { get; set; } 
    Button buttonForDoingWhatItDoes { get; set; } 
}