如何刷新ListBox的DataSource

pan*_*njo 45 .net c# winforms

Form有一个Combobox和一个ListBox.单击"添加"按钮时,我想将选定的项目从ComboBox添加到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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,所选项目将替换为ListBox中的新选择.我需要将项目添加到列表中.

我的代码出了什么问题?

dwo*_*sch 68

listbox1.DataSource 属性查找值更改,但通过分配相同的列表,值不会真正更改.

您可以使用a 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只需添加`listBox1.DataSource = null;`作为`ShowData()`方法的第一行 (3认同)
  • 感谢一大堆,我花了一个小时试图找出为什么我的列表框不能正确显示我的项目,即使在密切关注微软的教程后http://msdn.microsoft.com/en-us/library/system.windows .forms.listcontrol.datasource.aspx?CS-保存琅= 1&CS琅= CSHARP#代码片断-2- (2认同)

gza*_*axx 27

我建议使用,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在飞行中更改控件数据源有时会产生奇怪的结果.


raj*_*azo 17

列表框未检测到您已更改DataSource.它只会在Datasource更改后刷新,因此DataSource首先设置为null:

listBox1.DataSource = null;
listBox1.DataSource = data;
Run Code Online (Sandbox Code Playgroud)

您还可以清除项目,然后再次设置DataSource:

listBox1.Items.Clear();
listBox1.DataSource = data;
Run Code Online (Sandbox Code Playgroud)

  • 设置DataSource属性时,无法修改项集合.所以第二个例子不起作用. (9认同)
  • **注意事项:**设置`listBox1.DataSource = null`*也*将`DisplayMember`设置为空字符串(但不是'ValueMember`).(在使用.NET 4.0 WinForms的调试器中发现了这一点.)因此,如果您使用`DisplayMember`和`ValueMember`,请确保在将`DataSource`设置为`null`后重新分配`DisplayMember`. (6认同)