2013-07-12 7 views
33

में किसी सूची बॉक्स के डेटासोर्स को रीफ्रेश कैसे करें फ़ॉर्म में एक कम्बोबॉक्स और एक सूची बॉक्स है। जब "जोड़ें" बटन क्लिक किया जाता है, तो मैं चयनित आइटम को कॉम्बोबॉक्स से ListBox में जोड़ना चाहता हूं।सी # WinForms

public partial class MyForm:Form 
{ 
    List<MyData> data = new List<MyData>(); 
    private void ShowData() 
    { 
     listBox1.DataSource = data; 
     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 
     ShowData(); 
    } 

} 

इस उदाहरण के साथ, चयनित आइटम को सूची बॉक्स के अंदर नए चयन के साथ प्रतिस्थापित किया गया है। मुझे सूची में आइटम जोड़ने की जरूरत है।

मेरे कोड में क्या गलत है?

धन्यवाद।

+0

क्या 'शोडाटा()' और 'लोडडाटा()' के बीच कोई अंतर है या क्या यह एक गलती है? – dwonisch

+0

लोडडाटा के लिए कोड()? इस बारे में आपने यहां सूचीबद्ध सूची बॉक्स में पोस्ट नहीं किया है, आपको –

+0

के साथ कोई समस्या है, हालांकि यह शोडाटा(), क्षमा करें, अच्छी आंख है। – panjo

उत्तर

47

listbox1.DataSource संपत्ति के मूल्य में परिवर्तन के लिए, लेकिन द्वारा लग रहा है वही सूची असाइन करना जब भी मूल्य वास्तव में नहीं बदलेगा।

आप अपने List<T> के बजाय BindingList<T> का उपयोग कर सकते हैं, ताकि नए आइटम जोड़े गए स्वचालित रूप से पहचान सकें। स्टार्टअप पर आपकी शोडाटा() विधि को एक बार कॉल किया जाना चाहिए।

public partial class MyForm:Form 
{ 

    public MyForm(){ 
     InitializeComponent(); 
     ShowData(); 
    } 

    BindingList<MyData> data = new BindingList<MyData>(); 

    private void ShowData() 
    { 
     listBox1.DataSource = data; 
     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 
    } 
} 
+3

बस 'listBox1.DataSource = null;' को अपनी 'शोडाटा()' विधि – NoviceProgrammer

+2

की पहली पंक्ति के रूप में जोड़ें, इसके लिए एक गुच्छा धन्यवाद, मैंने यह जानने का प्रयास करने में एक घंटा बिताया है कि मेरा सूची बॉक्स मेरे आइटम ठीक से क्यों नहीं दिखाएगा माइक्रोसॉफ्ट के ट्यूटोरियल के बाद निकटता http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.datasource.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet- 2 – Aralox

+0

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

19

मैं BindingSource का उपयोग करने का सुझाव दूंगा क्योंकि यह कनेक्ट किए गए नियंत्रणों को सही तरीके से अपडेट करेगा।

public partial class MyForm : Form 
{ 
    List<MyData> data = new List<MyData>(); 
    BindingSource bs = new BindingSource(); 

    public MyForm() 
    { 
     IntializeComponents(); 
     bs.DataSource = data; 

     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
     listBox1.DataSource = bs; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 

     bs.ResetBindings(false); 
    } 
} 

फ्लाई पर नियंत्रण डेटा स्रोत बदलना कभी-कभी अजीब परिणाम उत्पन्न करता है।

12

सूची बॉक्स को पता नहीं चला कि आपने DataSource बदल दिया है। यह केवल ताज़ा होगी जब Datasource बदल गया है, तो DataSource सेट पहले शून्य पर:

listBox1.DataSource = null; 
listBox1.DataSource = data; 

तुम भी आइटम साफ़ कर सकता है तो डेटा स्रोत फिर से सेट:

listBox1.Items.Clear(); 
listBox1.DataSource = data; 
+6

डेटा संग्रह संपत्ति सेट होने पर आइटम संग्रह को संशोधित नहीं किया जा सकता है। तो दूसरा उदाहरण काम नहीं करेगा। –

+3

** एक चेतावनी नोट: ** 'सूची बॉक्स 1। डेटासोर्स = नल' * सेट करना * खाली स्ट्रिंग पर' DisplayMember' सेट करता है (लेकिन 'ValueMember' नहीं)। (इसे .NET 4.0 WinForms के साथ डीबगर में खोजा गया।) इसलिए, यदि आप 'DisplayMember' और 'ValueMember' का उपयोग कर रहे हैं, तो' DataSource' को' null' 'सेट करने के बाद' DisplayMember' को फिर से असाइन करना सुनिश्चित करें। – DavidRR

3

वैकल्पिक रूप से और इस लागू करने के लिए शायद सबसे सही तरीका प्रदान की ObservableCollection<T> उपयोग करने के लिए है। यह INotifyCollectionChanged को लागू करने के एकमात्र उद्देश्य के साथ बनाया गया है।

public partial class MyForm : Form 
{ 
    ObservableCollection<MyData> data = new ObservableCollection<MyData>(); 

    public MyForm() 
    { 
     listBox1.DataSource = data; 
     listBox1.DisplayMember = "Name"; 
     listBox1.ValueMember = "Id"; 
    } 

    private void buttonAddData_Click(object sender, EventArgs e) 
    { 
     var selection = (MyData)comboBox1.SelectedItem; 
     data.Add(selection); 
    } 
} 

क्योंकि ObservableCollection<T> औजार INotifyCollectionChanged डेटा स्रोत स्वचालित रूप से ListBox अद्यतन करेगा जब भी आपका डेटा परिवर्तन बंधन।

0

कॉल ShowData() जब प्रपत्र

public Department() 
     { 
      InitializeComponent(); 
      ShowData(); 
     } 

ShowData() विधि है, जहां BindingSource, DisplayMember और ValueMember

private void ShowData() 
      { 
       using (var uow = new UnitOfWork(new SellContext())) 
       { 
        listBox1.DataSource = uow.Departments.GetAll().ToList(); 
        listBox1.DisplayMember = "DepartmentName"; 
        listBox1.ValueMember = "DepartmentId"; 
        //listBox1.Invalidate();  
       } 
      } 

सेट कर रहे हैं, नीचे एक विभाग हटा दी जाती है कार्यान्वयन में प्रारंभ पर अपने लिस्टबॉक्स पॉप्युलेट करने के लिए आरंभ डेटाबेस से सूची संग्रह वर्तमान संग्रह

के साथ रीफ्रेश करता है
private void button1_Click(object sender, EventArgs e) 
    { 
     try { 
      using (var uow = new UnitOfWork(new SellContext())) 
      { 
       int count = uow.Departments.FindDepartmentByName(txtDeptName.Text.ToString()); 
       if (count>0) 
       { 
        MessageBox.Show("This Department Already Exists", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Hand); 
       } 

       else 
       { 
        department dept = new department(); 
        dept.DepartmentName = txtDeptName.Text.ToString(); 
        uow.Departments.Create(dept); 
        if (uow.Complete() > 0) 
        {   
         MessageBox.Show("New Department Created", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Information); 
         txtDeptName.Text = ""; 
         ShowData();  
        } 
        else 
        { 
         MessageBox.Show("Unable to add Department", "SellRight", MessageBoxButtons.OK, MessageBoxIcon.Error); 
         txtDeptName.Text = ""; 
         ShowData(); 
        } 
       } 
      }        
     } 
     catch(Exception ex) 
     { 
      ex.ToString(); 
     } 
    }