2010-05-06 11 views
5

मैं जो इस तरह दिखता है एसक्यूएल सर्वर में एक टेबल है से निपटने के लिए:उचित बाध्यकारी डेटा बता गया और उसके घटनाओं

ID Code Name  Surname 
1 MS Mike  Smith 
2 JD John  Doe 
3 UP Unknown Person 

और इतने पर ...

अब मैं इस से डेटा बाध्य करने के लिए चाहते हैं कॉम्बोबॉक्स में टेबल को इस तरह से कॉम्बोबॉक्स में मैंने कोड कॉलम से मूल्य प्रदर्शित किया है।

मैं इस तरह से बाध्यकारी कर रहा हूँ:

SqlDataAdapter sqlAdapter = new SqlDataAdapter("SELECT * FROM dbo.Users ORDER BY Code", MainConnection); 
sqlAdapter.Fill(dsUsers, "Users"); 
cbxUsers.DataSource = dsUsers.Tables["Users"]; 
cmUsers = (CurrencyManager)cbxUsers.BindingContext[dsUsers.Tables["Users"]]; 
cbxUsers.DisplayMember = "Code"; 

और यह कोड काम करने के लिए लगता है। मैं कोडों की सूची के माध्यम से स्क्रॉल कर सकते हैं। इसके अलावा मैं हाथ से कोड लिखना शुरू कर सकता हूं और कॉम्बोबॉक्स मेरे लिए कोड स्वतः पूर्ण कर देगा।

हालांकि, मैं वर्तमान में चयनित उपयोगकर्ता कोड के नाम और उपनाम को प्रदर्शित करने के लिए combobox के शीर्ष पर एक लेबल रखना चाहता था।

कि हालांकि की तरह था की मेरी लाइन: "तो, मैं एक घटना है जो बता गया में और उस स्थिति में मैं वर्तमान DataRow मिल जाएगा कोड में परिवर्तन के बाद अप को सक्रिय कर देगा खोजने की जरूरत है ..."

मैं combobox की घटनाओं के माध्यम से ब्राउज़ कर रहा था, उनमें से कई कोशिश की लेकिन सफलता के बिना।

उदाहरण के लिए:

private void cbxUsers_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
if (cmUsers != null) 
{ 
    DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current; 
    DataRow drCurrentRow = drvCurrentRowView.Row; 
    lblNameSurname.Text = Convert.ToString(drCurrentRow["Name"]) + " " + Convert.ToString(drCurrentRow["Surname"]); 
} 
} 

यह मैं एक अजीब परिणाम देती है। सबसे पहले जब मैं माउस स्क्रॉल के माध्यम से स्क्रॉल करता हूं तो यह मुझे उस पंक्ति को वापस नहीं करता है जिसे मैं प्राप्त करने की उम्मीद कर रहा हूं। उदाहरण के लिए जेडी पर यह मुझे "माइक स्मिथ" दिखाता है, एमएस पर यह मुझे "जॉन डो" दिखाता है और यूपी पर यह मुझे "माइक स्मिथ" दिखाता है! दूसरी समस्या यह है कि जब मैं कॉम्बोबॉक्स में टाइप करना शुरू करता हूं और एंटर दबाता हूं तो यह ईवेंट को ट्रिगर नहीं करता है।

हालांकि, सब कुछ उम्मीद के रूप में जब मैं इस तरह से lblNameSurname.Text करने के लिए डेटा बाँध काम करता है:

lblNameSurname.DataBindings.Add("Text", dsusers.Tables["Users"], "Name"); 

समस्या यहाँ है कि मैं केवल एक स्तंभ बाध्य कर सकते हैं और मैं दो करना चाहते हैं। मैं इसके लिए दो लेबल का उपयोग नहीं करना चाहता (एक नाम प्रदर्शित करने के लिए और अन्य उपनाम प्रदर्शित करने के लिए)।

तो, मेरी समस्या का समाधान क्या है?

इसके अलावा, मेरे पास कॉम्बोबॉक्स में डेटा चयन से संबंधित एक प्रश्न है। अब, जब मैं combobox में कुछ टाइप करता हूं तो यह मुझे उन अक्षरों को टाइप करने की अनुमति देता है जो सूची में मौजूद नहीं हैं। उदाहरण के लिए, मैं "जे" टाइप करना शुरू करता हूं और "डी" के साथ खत्म करने के बजाय, "मेरे पास" जेडी "होगा, मैं" Jsomerandomtexthere "टाइप करता हूं। Combobox इसकी अनुमति देगा लेकिन इस तरह की आइटम सूची में मौजूद नहीं है। दूसरे शब्दों में, मैं कंबोबॉक्स को उपयोगकर्ता को टाइपिंग कोड से रोकने के लिए चाहता हूं जो कोड की सूची में नहीं है।

उत्तर

2

बस इस पर एक परीक्षण किया, और मुझे लगता है कि आप जो खोज रहे हैं वह गलत घटना (शायद गलत वस्तु) से भी जुड़ा हुआ है।

मैंने अभी ईवेंटमैनगर ऑब्जेक्ट (cmUsers) के PositionChanged हैंडलर को ईवेंट जोड़ने का प्रयास किया है, और यह बिल्कुल इरादे से काम करता है। मेरे साथ एकमात्र मुद्दा यह था कि यह पहली बार लोड हो गया था, यह स्थितिChanged को हिट नहीं करता है, इसलिए पहला आइटम लेबल से कभी भी बाध्य नहीं होता है (मुझे यकीन है कि एक आसान फिक्स है)। http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingmanagerbase.positionchanged.aspx

एक छोटे से परीक्षण Ran को देखने के लिए जो घटना पहले सक्रिय हो गया है, और यह PositionChanged से पहले निकाल दिया SelectionChangeCommitted घटना, CurrencyManager अर्थ लगता है अद्यतन नहीं किया यह अभी तक आंतरिक स्थिति है, तो लाइन:

DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current; 

गलत DataRow खींचता है।

अपने दूसरे मुद्दे के बारे में भूल गए। अधिकांश नियंत्रण कुंजीपेशियों को संभाल नहीं पाते हैं, तो आपको जो भी करना चाहिए, उसे चलाने के लिए ऑनकेडडाउन या ऑनकेपप्रेस ईवेंट को बाध्य करना चाहिए (टाइप की गई वस्तु [यानी FindString()] से जुड़े इंडेक्स को ढूंढना, और कॉम्बोबॉक्स सेट करना। चयनित इंडेक्स प्रॉपर्टी पाया सूचकांक, अन्यथा एक चेतावनी फ्लैश)। उदाहरण के लिए:

if(e.KeyCode == Keys.Enter) 
{ 
    int indx; 
    cmbBox.SelectAll(); 
    if((indx = FindString(cmbBox.SelectedText)) != -1) 
     cmbBox.SelectedIndex = indx; 
    else 
     // Some warning 
} 

संपादित अपनी टिप्पणी पढ़ने के बाद, मैं सत्यापन करने के लिए एक आसान तरीका लगा।कॉम्बोबॉक्स के "कीप्रेस" घटना में, निम्न कोड का उपयोग करें:

if(e.KeyChar != (char)Keys.Enter) 
{ 
    if(cmbBox.FindString(cmbBox.Text + e.KeyChar) == -1) 
    { 
     e.Handled= true; 
    } 
} 

कोई झगड़ा नहीं, कोई मुसब्बर नहीं। चूंकि हम यहां सूची में केवल आइटम तक ही सीमित हैं, इसलिए जब हम एंटर दबाते हैं तो हमें इसे संभालने की आवश्यकता नहीं होती है क्योंकि इसे स्वचालित रूप से चयनित आइटम को बदलना चाहिए (हालांकि, यह सुनिश्चित करने के लिए कुछ मान्यताओं को चलाने में कोई दिक्कत नहीं होगी कि यह उचित है सीएएसई, या एंटर कीप्रेस पर मैन्युअल रूप से चयनित इंडेक्स प्रॉपर्टी को बदल दिया है)। फिर भी, उम्मीद है कि इससे किसी को मदद मिलेगी।

+0

आपकी रुचि के लिए धन्यवाद, मैं एक बार फिर से इस मुद्दे को देखूंगा। – Wodzu

+0

आपको सही था। आपने मुझे इसके बारे में एक बार फिर से सोचने के लिए बनाया है और मैंने एक बाध्यकारी स्रोत जोड़ा है (जो मुद्रा प्रबंधक को दिखाता है) घटनाएं। उनके माध्यम से मैं कार्य पूरा करने में सक्षम हूं। – Wodzu

0

अपने दूसरे प्रश्न के लिए दो तरीके मैं सामान्य रूप से यह या तो कॉम्बो बॉक्स के लिए Validating घटना को संभालने से पहले मैं प्रपत्र छोड़ देते हैं (और अक्षम जारी रखने के लिए बटन या एक त्रुटि संदेश फेंक) या ComboBoxStyle.DropDownList

को ComboBox.DropDownStyle सेट है
+0

धन्यवाद स्कॉट। मुझे नहीं लगता कि उनमें से कोई भी समाधान मेरे लिए अच्छा नहीं है। जहां तक ​​मुझे पता है कि DropDownList के लिए शैली को बदलने से टाइपिंग अक्षम हो जाएगी और मुझे वह नहीं चाहिए। मैं सिर्फ सूची में मौजूद चीजों को टाइप करना प्रतिबंधित करना चाहता हूं। लेकिन मुझे लगता है कि मैं कुंजीपटल घटना में अपना खुद का सत्यापन लिख सकता हूं और यह ठीक होगा। – Wodzu

0

ठीक है, आप नाम और उपनाम को एक कॉलम के रूप में प्राप्त करने के लिए अपना एसक्यूएल बदल सकते हैं, और फिर उस कॉलम में एक बार बांध सकते हैं। इसके अलावा, मैं कॉम्बो और लेबल को अजाक्स अपडेट पैनल में रखूंगा।

सत्यापन के संबंध में: क्लाइंट पर सत्यापन करने के लिए आपको पहले से ही क्लाइंट पर सभी संभावित मूल्यों की आवश्यकता है, या प्रत्येक char के लिए पोस्टबैक होना चाहिए और एसक्यूएल को एक (जो शायद एक अच्छा विचार नहीं है - मारता है सर्वर):

SELECT code FROM TABLE WHERE code LIKE @x + '%' 

एक स्वत: पूर्ण-बॉक्स एक स्वीकार्य विकल्प है? उदाहरण के लिए jQuery का स्वत: पूर्ण बॉक्स देखें।

0

निम्नलिखित का प्रयास करें:

एक बाध्यकारी वस्तु मैन्युअल बनाएँ ताकि आप इसे करने के लिए एक संदर्भ है। अपने कॉम्बोबॉक्स की चुनीItem संपत्ति से जुड़ने के लिए बाइंडिंग ऑब्जेक्ट का उपयोग करें। मुझे लगता है कि यह आपको चयनित डेटारो मिलना चाहिए। उस बाइंडिंग ऑब्जेक्ट को लेबल के डेटाबिंडिंग संग्रह में जोड़ें।

बाइंडिंग को संभालें। फॉरमेट इवेंट (या यह पार्स हो सकता है - यह याद नहीं कर सकता कि कौन सी घटना उस दिशा में बाध्यकारी होने पर लागू होती है) और ईवेंट में प्राप्त डेटारो ऑब्जेक्ट का उपयोग करें, उचित ऑब्जेक्ट स्ट्रिंग बनाने के लिए ऑब्जेक्ट का तर्क देता है दोनों forename और उपनाम। आपको उस स्ट्रिंग में EventArgs की कुछ अन्य संपत्ति सेट करने की आवश्यकता होगी।

आपको बाध्यकारी वर्ग की स्वरूपण सक्षम संपत्ति के साथ भी खेलना पड़ सकता है - यह थोड़ी देर के बाद से मैंने यह किया है, मुझे याद है कि यह थोड़ा मुश्किल था। http://msdn.microsoft.com/en-us/library/system.windows.forms.binding_events.aspx

0

आमतौर पर लटकती चयनित सूचकांक परिवर्तन की घटना होती है जब आप आप चयन बदल कर बाहर क्लिक या टैब कुंजी दबाने की तरह लटकती की बाहर अपने फ़ोकस:

पार्स और स्वरूप की घटनाओं के लिए दस्तावेज़ देखें ...

आप किसी अन्य घटना के लिए की तलाश या के माध्यम से घटना आह्वान करना चाहिए आप इसे तुरंत गति प्रदान करने की जरूरत है जावास्क्रिप्ट onchange घटना, आदि ...

संबंधित मुद्दे