[英]Binding a TextBox to a ListBox SelectedItem
我目前正在嘗試實現一個相對簡單的數據管理應用程序。
我有一個類Member
和BindingList<Member> membersList
,以及一個ListBox
和一些TextBox
。
ListBox
綁定到membersList
。
現在,理想情況下,現在我想將TextBox
綁定到ListBox.SelectedItem
,以便用戶在ListBox
選擇的任何元素,當他們編輯TextBox
, membersList
更新membersList
的元素。
我嘗試僅將TextBox
es綁定到ListBox.SelectedItem
,但這使Binding
到ListBox.SelectedItem
在綁定創建時所引用的實際元素上,而不是在ListBox
選擇的任何項目。
firstNameTextBox.DataBindings.Add(new Binding("Text",
membersList.SelectedItem, "firstName", false,
DataSourceUpdateMode.OnPropertyChanged));
我實際上已經通過在membersList_SelectedIndexChanged(object sender, EventArgs e)
事件處理程序中清除並重新創建TextBox
的Bindings
而解決了這個問題,但這感覺非常“棘手”,我懷疑還有更標准的解決方案。
我的另一個想法是將Binding
s設置為membersList_SelectedIndexChanged(object sender, EventArgs e)
事件處理程序內設置為ListBox.SelectedItem
的Member temporaryMember
,但隨后我必須手動將更改寫入到相應的項目中membersList
,這也讓我覺得這不是最佳解決方案。
有某種方法可以使Binding
動態化,即在創建后我向其指示DataSource正在更改?
還是以一種標准的方式更改Binding
的DataSource而不刪除它並創建一個新的? (或者這實際上是最佳實踐嗎?)
(要提及的另一件事:我是C#中的Bindings
新手,在搜索解決方案時,我發現顯然有兩個不同的類,一個在System.Windows.Data
命名空間中,另一個在System.Windows.Forms
命名空間中。我想我使用的是后者的類,也許我應該使用另一個?
如注釋中所述,將BindingList (或DataTable)與BindingSource關聯可以帶來一些有趣的好處。
當BindingList
的元素之一被修改或新元素添加到列表中時,所有綁定控件都將自動更新。
您可以使用MovePrevious()
, MoveNext()
, MoveFirst()
, MoveLast()
方法來導航BindingList
的元素(其他有用的方法和事件可用,請參閱有關BindingSource功能的文檔)。
在這里,將BindingList<T>
(其中T
是下面顯示的Member
類)設置為BindingSource的DataSource。 兩者都是Form類的Field,可以根據需要進行修改。
然后將BindingSource用作ListBox的數據源。
然后,使用BindingSource將兩個TextBox控件的Text
屬性綁定到Member
類的屬性之一。 這樣,Text屬性設置為BindingList的當前Item。 所有控件均已同步 :
txtMemberName.DataBindings.Add(new Binding("Text", membersSource,
"FirstName", false, DataSourceUpdateMode.OnPropertyChanged));
txtMemberLastName.DataBindings.Add(new Binding("Text", membersSource,
"LastName", false, DataSourceUpdateMode.OnPropertyChanged));
實際上是這樣的:
請注意,修改文本框的文本后,將實時更新列表框的當前項目。
BindingList<Member> members = null;
BindingSource membersSource = null;
public partial class frmMembers : Form
{
public frmMembers() {
InitializeComponent();
InitializeDataBinding();
}
private void InitializeDataBinding()
{
members = new BindingList<Member>();
membersSource = new BindingSource(members, null);
lstBoxMembers.DataSource = membersSource;
txtMemberName.DataBindings.Add(new Binding("Text", membersSource,
"FirstName", false, DataSourceUpdateMode.OnPropertyChanged));
txtMemberLastName.DataBindings.Add(new Binding("Text", membersSource,
"LastName", false, DataSourceUpdateMode.OnPropertyChanged));
}
private void btnAddMember_Click(object sender, EventArgs e)
{
var frmNew = new frmNewMember();
if (frmNew.ShowDialog() == DialogResult.OK && frmNew.newMember != null) {
members.Add(frmNew.newMember);
}
}
private void btnMovePrevious_Click(object sender, EventArgs e)
{
if (membersSource.Position > 0) {
membersSource.MovePrevious();
}
else {
membersSource.MoveLast();
}
}
private void btnMoveNext_Click(object sender, EventArgs e)
{
if (membersSource.Position == membersSource.List.Count - 1) {
membersSource.MoveFirst();
}
else {
membersSource.MoveNext();
}
}
}
新會員表格樣本:
public partial class frmNewMember : Form
{
public Member newMember;
private void btnSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(txtMemberName.Text) ||
string.IsNullOrEmpty(txtMemberLastName.Text)) return;
newMember = new Member(txtMemberName.Text, txtMemberLastName.Text);
}
}
樣本成員類:
[Serializable()]
public class Member
{
public Member() { }
public Member(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString() => $"{this.FirstName} {this.LastName}";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.