2012-07-27 81 views
0

我有我的更新方法的窗体,窗体是详细视图。在文本框旁边,我有一个列表框,显示数据库表中所有名称的名称。在列表框中,我还有一个额外的文本框来快速搜索名称,以防用户想要键入它。刷新列表框的数据源

当我去更新其中一个名称时,比如将John更改为Jonathan,数据库更新为新的名字,因为我已经检查了SQL服务器,但列表框中的名称不会改变!通过将当前选择的列表框的位置移动到movefirst()可以解决这个问题。但是,在列表框中,我有一个快速搜索的文本框,所以我在搜索文本框中键入Jonathan,但没有任何内容出现。但是,如果我输入John的名字,那么我会在表格中获得该行的详细信息。

有没有办法解决这个问题?

更新1:

伊夫试图使列表框的数据源空然后再次重新分配,但它doesen't工作。我将我的代码放在下面的更新表单中。


命名空间WindowsFormsApplication1 { 公共部分类updateContact:形式 { 公共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

你必须设置你的ListBox的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"; 
     } 

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

+0

不知道为什么ü已经创建了一个person对象类的数据库,它是一个实践ü即使我已经了解了面向对象的数据库,也应该这样做。但这是我第一次亲自做一个项目来学习数据库。所以例如我有我的数据库中的联系人表,我应该创建一个联系人类?并列出所有成员这个类如何链接到我的SQL数据库联系表tho? – KHAN 2012-07-27 20:42:03

+0

这只是想象,一个虚拟的数据库为例,取决于你的需要,也有自动解决这个许多技术,这就是所谓的ORM(对象关系映射),实体框架是其中之一 – 2012-07-27 20:44:57

+0

啊好吧好吧,我试图乌尔法didint工作:/ – KHAN 2012-07-28 07:57:02

0

如果您的数据源是一个DataTable,所有你需要做的就是调用的AcceptChanges(),像这样:

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