刷新列表框的数据源

时间:2012-07-27 19:56:08

标签: c# refresh datasource

我有一个表单用于我的更新方法,表单是详细视图。在文本框旁边,我有一个列表框,显示数据库表中所有名称的名称。在列表框下我还有一个额外的文本框,可以快速搜索名称,以防用户想要输入。

当我更新其中一个名称时,例如将John更改为Jonathan,数据库使用新名称进行更新,因为我已在sql server上检查过,但列表框中的名称不会更改!通过将当前选择列表框的位置移动到movefirst(),有一种肮脏的方法来解决这个问题。但是,在列表框下面,我有一个快速搜索的文本框,正如我所提到的,所以我在搜索文本框中输入Jonathan,但没有出现。但是,如果我输入以前的名字John,那么我会在表格中获得该行的详细信息。

我有办法解决这个问题吗?

更新1:

我已尝试将列表框数据源设为null,然后再次重新分配它,但它无法正常工作。我把我的代码放在下面的更新表格中。


命名空间WindowsFormsApplication1 {     public partial class updateContact:Form     {         public updateContact()         {             的InitializeComponent();         }

    private void updateContact_Load(object sender, EventArgs e)
    {
        // TODO: This line of code loads data into the 'tblcontactsupdate.tblContacts' table. You can move, or remove it, as needed.
        this.tblContactsTableAdapter.Fill(this.tblcontactsupdate.tblContacts);
    }
    private void btnUpdateContact_Click(object sender, EventArgs e)
    {
        int x;

        Program.da.UpdateCommand = new SqlCommand("Update tblContacts SET FIRSTNAME = @FIRSTNAME, LASTNME = @LASTNME WHERE ID = @ID", Program.cs);
        Program.da.UpdateCommand.Parameters.Add("@FIRSTNAME", SqlDbType.VarChar).Value = fIRSTNAMETextBox.Text;
        Program.da.UpdateCommand.Parameters.Add("@LASTNME", SqlDbType.VarChar).Value = lASTNMETextBox.Text;
        Program.da.UpdateCommand.Parameters.Add("@ID", SqlDbType.VarChar).Value = iDTextBox.Text;

        Program.cs.Open();
        x = Program.da.UpdateCommand.ExecuteNonQuery();
        Program.cs.Close();

        if (x >= 1)
        {
            MessageBox.Show("Record(s) has been updated");
            Program.ds.Clear();
            Program.da.Fill(Program.ds);
            txtfindUpdatecontact.Text = "";
            //lbupdateContact.DataSource = null;
            //lbupdateContact.DataSource = this.tblcontactsupdate.tblContacts;
        }       
    }
    private void txtfindUpdatecontact_TextChanged(object sender, EventArgs e)
    {
        if (!txtfindUpdatecontact.Text.Equals(""))
        {
            this.tblContactsBindingSource.Filter = "FIRSTNAME = '" + txtfindUpdatecontact.Text + "'";

        }
        else
        {
            this.tblContactsBindingSource.RemoveFilter();
        }
    }

    private void lbupdateContact_SelectedIndexChanged(object sender, EventArgs e)
    {

    }

    private void iDTextBox_TextChanged(object sender, EventArgs e)
    {

    }

    private void fIRSTNAMETextBox_TextChanged(object sender, EventArgs e)
    {

    }

    private void lASTNMETextBox_TextChanged(object sender, EventArgs e)
    {

    }
}

}

2 个答案:

答案 0 :(得分:2)

更新来源后,您必须再次设置列表框的DataSource

如下所示:这是我的数据:

 public class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

    public class MyDataSource
    {
        public static List<Person> Persons = new List<Person>
        {
            new Person{Age=30,Name="Ram"},
            new Person{Age=33,Name="Rahim"},
        };
    }

然后在表单的构造函数中,您可以执行:

 listBox1.DataSource = MyDataSource.Persons;
 listBox1.DisplayMember = "Age";

然后进行更新,如下所示:

private void button1_Click(object sender, EventArgs e)
        {
            MyDataSource.Persons[0].Age = 45;
            listBox1.DataSource = null;
            listBox1.DataSource = MyDataSource.Persons;
            listBox1.DisplayMember = "Age";
        }

根据您的需要,这只是一个示例更改代码。

答案 1 :(得分:0)

如果您的DataSource是DataTable,您所要做的就是调用AcceptChanges(),如下所示:

listBox.DataSource = null;  
((DataTable)listBox.DataSource).AcceptChanges();