2012-07-27 80 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();