2013-07-12 54 views
33

表單有一個組合框和一個ListBox。當單擊「添加」按鈕時,我想將所選項目從組合框添加到列表框中。如何在C#WinForms中刷新ListBox的數據源

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(); 
    } 

} 

在此示例中,所選項目將被替換爲ListBox內的新選擇。我需要將該項目添加到列表中。

我的代碼有什麼問題?

謝謝。

+0

ShowData()和LoadData()之間有區別嗎?還是這是一個錯誤? – dwonisch

+0

LoadData()的代碼?你沒有發佈關於這個列表框,你有 –

+0

的問題它是ShowData(),對不起,雖然好眼睛。 – panjo

回答

47

listbox1.DataSource屬性查找值的變化,但由始終分配相同的列表,該值不會真正改變。

您可以使用BindingList<T>而不是您的List<T>自動識別添加的新項目。您的ShowData()方法在啓動時必須調用一次。

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;'作爲第一行到你的'ShowData()'方法 – 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

哦,這很漂亮。我可以使用它來刷新ListBox時編輯它的項目,而不會不必要地搞亂滾動位置。 – 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

設置DataSource屬性時,無法修改項目集合。所以第二個例子不起作用。 –

+3

**注意:**設置'listBox1.DataSource = null' *也*設置'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數據源綁定會自動更新列表框時,您的數據的變化。

0

呼叫ShowData()當窗體初始化爲填充您的列表框上初始化

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

ShowData()方法,其中BindingSourceDisplayMemberValueMember設置

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(); 
     } 
    }