2008-12-05 9 views
8

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

मैं चाहता कहना

button1.DataBindings.Add(new Binding("checked", source, "useFoo")); 
button2.DataBindings.Add(new Binding("checked", source, "!useFoo")); 

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

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


जवाब के बारे में: समाधान मैं शामिल व्यवसाय वस्तु को संशोधित करने का उपयोग कर बंद कर - मूल विचार बहुत एक Gurge द्वारा पोस्ट की गई के समान है, लेकिन मैं इसे अलग से के साथ आया था इससे पहले कि मैं उसकी प्रतिक्रिया पढ़ें। संक्षेप में, मैंने एक अलग संपत्ति जोड़ा जो बस !useFoo लौटाता है। एक रेडियो बटन source.UseFoo तक बाध्य है, और दूसरा source.UseBar (नई संपत्ति का नाम) से जुड़ा हुआ है। यह सुनिश्चित करना महत्वपूर्ण है कि नई संपत्ति में गेटर्स और सेटर्स दोनों हों, या आप वास्तव में अजीब व्यवहार के साथ हवादार हो जाएंगे।

उत्तर

1

मुझे डेटासेट/डेटाटेबल का उपयोग करके ऐसा करने का एक तरीका मिला है।

मैं अभिव्यक्ति IIF (Foo = true, false, true) के साथ डेटाटेबल में एक गणना कॉलम बना देता हूं। आइए कॉलम बार को कॉल करें।

बार बूलियन प्रकार का है। अब आप एक रेडियोबुटन को बांध सकते हैं। फू को चेक किया जा सकता है और एक बार में।

बार जाँच/वापस फू के लिए प्रचार करने के लिए आप उत्पन्न DataTable कोड के पास जाकर एक पंक्ति, इस नमूने में पिछले एक जोड़ना होगा अनचेक पाने के लिए:

  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
     public bool Bar { 
      get { 
       try { 
        return ((bool)(this[this.tableradio.BarColumn])); 
       } 
       catch (global::System.InvalidCastException e) { 
        throw new global::System.Data.StrongTypingException("The value for column \'Bar\' in table \'radio\' is DBNull.", e); 
       } 
      } 
      set { 
       this[this.tableradio.BarColumn] = value; 
       this[this.tableradio.FooColumn] = !value; 
      } 
     } 
+2

और हर बार जब आप अपना डेटासेट संपादित करते हैं तो यह परिवर्तन फिर से न भूलें! :-( – Mac

-3

आपको केवल तब तक नियंत्रणों को बांधना होगा जब तक कि आप सुनिश्चित करते हैं कि वे एक ही समूह में हैं।

आप ड्रॉपडाउन पर भी विचार कर सकते हैं।

+1

इसे आज़माएं: रेडियो बटन और एक चेकबॉक्स की एक जोड़ी बनाएं, और बाइंडिंगसोर्स के तहत एक ही बूलियन प्रॉपर्टी में एक रेडियो बटन और चेकबॉक्स बांधें। चेकबॉक्स को चेक करें और रेडियो टॉगल करें - कुछ भी नहीं होता है। अब, यदि आप * चेक * चेकबॉक्स चेक करते हैं, तो टॉगल करें, आप इसे चालू कर सकते हैं, लेकिन कभी नहीं बंद कर सकते हैं। – Coderer

1

अपने व्यापार वस्तु को लागू करता है तो INotifyPropertyChanged (जो बाध्यकारी काम nicer बनाता है), आप दृश्य इंटरफ़ेस में निम्न कोड जोड़ सकते हैं जहां BO आपकी व्यावसायिक वस्तु है और इसे सुगंधित घोषित किया गया है और BO.Value वह बूलियन संपत्ति है जिसे आप बाध्य करना चाहते हैं।

Public Property NotValue() As Boolean 
    Get 
     Return Not BO.Value 
    End Get 
    Set(ByVal value As Boolean) 
     BO.Value = Not value 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue")) 
    End Set 
End Property 


Private Sub BO_PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Handles BO.PropertyChanged 
    If e.PropertyName = "Value" Then 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue")) 
    End If 
End Sub 

निम्नलिखित बाइंडिंग रेडियो बटन को हुक अप करेंगे।

RBTrue.DataBindings.Add(New Binding("Checked", Me.BO, "Value", False, DataSourceUpdateMode.OnPropertyChanged)) 
RBFalse.DataBindings.Add(New Binding("Checked", Me, "NotValue", False, DataSourceUpdateMode.OnPropertyChanged)) 

दृश्य इंटरफ़ेस को INotifyPropertyChanged भी कार्यान्वित करना चाहिए। यह विधि दोनों तरीकों से काम करती है: इंटरफ़ेस में परिवर्तन होने पर मूल मान अपडेट हो जाता है और यदि मूल मान इंटरफ़ेस बदलता है तो सही तरीके से अपडेट हो जाएगा।

5
  1. बाइंड RadioButton जो सीधे आपके बूलियन मान से जुड़ा हुआ है (जब मूल्य true है यानी चेक किया गया है)।
  2. इस RadioButton कि ऐसा दिखाई देता है पर CheckedChanged घटना के लिए एक ईवेंट हैंडलर जोड़ें:

    private void radioButton_CheckedChanged(object sender, EventArgs e) 
    { 
        foreach (Binding b in ((Control)sender).DataBindings) 
         b.WriteValue(); 
    } 
    
1

मैं एक ही समस्या के पार आया, और पता चला कि यह वास्तव में मानक डेटा बाइंडिंग के साथ संभव है:

button1.DataBindings.Add(new Binding("checked", source, "useFoo", false, DataSourceUpdateMode.OnPropertyChanged); 
// no need to databind button 2, since button1.checked 
// is set to false when button2 is checked 

डिफ़ॉल्ट रूप से, DataSourceUpdateModeOnValidation पर सेट है। इसे OnPropertyChanged पर सेट करके, परिवर्तन को डाटाबेस ऑब्जेक्ट पर तुरंत प्रचारित किया जाता है।

मेरा व्यवसाय ऑब्जेक्ट INotifyPropertyChanged लागू करता है;

इस समाधान का परीक्षण करके, मुझे पता चला कि button2 पर क्लिक करने पर मुझे OnPropertyChanged ईवेंट दो बार निकाल दिया गया था। इसे रोकने के लिए, बस

button1.CausesValidation = false; 
button2.CausesValidation = false; 

सेट जैसा कि यहाँ दिखाया: TextBox leave causes PropertyChanged get fired twice

1

मैन्युअल रूप से ऐसा कोड में। जब आप फॉर्म लोड करते हैं तो अपने रेडियो बटन को अपने डेटाबेस के अनुसार सेट करें। जब आप चाहें तो "सेव" बटन स्टोर डी स्टेट दबाएं। यह उदाहरण डेटाबेस में बिट फ़ील्ड के रूप में रेडियो स्टोर करता है।

 // Load radio state 
     radioButton1.Checked = ((myModel)myBindingSource.DataSource).boolOption1; 
     radioButton2.Checked = ((myModel)myBindingSource.DataSource).boolOption2; 

-

 // Save radio state 
     ((myModel)myBindingSource.DataSource).boolOption1 = radioButton1.Checked; 
     ((myModel)myBindingSource.DataSource).boolOption2 = radioButton2.Checked; 

मैं दृश्य स्टूडियो 2015 में जब मैं तालिका में बूलियन्स के रूप में मेरे रेडियो बटन परिभाषित में "डेटा स्रोत" पैनल से आइटम खींचें करने की कोशिश की लेकिन वहाँ है बूलियन्स के साथ मुद्दों नहीं जब किसी अन्य रेडियो बटन का चयन किया जाता है तो गलत पर अपडेट किया जा रहा है। जब अन्य टेक्स्ट इनपुट फ़ील्ड के बीच कूदते समय "कारणों को वैधता" में बदलते हैं तो झूठी रेडियोबूटन स्वचालित रूप से अनचेक हो जाते हैं।

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