将文本框绑定到列表框 SelectedItem

我目前正在尝试实现一个相对简单的数据管理应用程序。

我有一个 classMember和 a BindingList<Member> membersList,以及 aListBox和一些TextBoxes 。

ListBox必然的membersList

现在,理想情况下,我希望将TextBoxes 绑定到ListBox.SelectedItem,以便用户在 中选择的任何元素在ListBox编辑TextBox中的元素时membersList都会更新。

我尝试将TextBoxes 绑定到ListBox.SelectedItem,但这使得 成为绑定创建时引用的Binding实际元素,而不是 中选择的任何项目。ListBox.SelectedItemListBox

firstNameTextBox.DataBindings.Add(new Binding("Text",
membersList.SelectedItem, "firstName", false,
DataSourceUpdateMode.OnPropertyChanged));

实际上,我已经通过在事件处理程序中清除并重新创建 es 来解决这个问题Bindings,但这感觉非常“hacky”,我怀疑有一个更标准的解决方案。TextBoxmembersList_SelectedIndexChanged(object sender, EventArgs e)

我的另一个想法是将 s 设置为事件处理程序内部的Bindinga ,但随后我必须手动将更改写入相应的项目,这也让我觉得这不是最佳解决方案。Member temporaryMemberListBox.SelectedItemmembersList_SelectedIndexChanged(object sender, EventArgs e)membersList

有没有一种方法可以实现Binding动态化,即在创建时,我向它表明数据源正在发生变化?

或者一种更改Binding数据源而不删除它并创建新数据源的标准方法?(或者这实际上是最佳实践?)

(另一件事要提的是:我是 C# 新手Bindings,在寻找解决方案时,我发现显然有两个不同的类,一个在命名空间中System.Windows.Data,另一个在System.Windows.Forms命名空间中。我想我正在使用后者的类。也许我应该使用另一个?)


德玛西亚99
浏览 71回答 1
1回答

GCT1015

正如评论中所述,将BindingList(或 DataTable)与BindingSource关联起来可以带来一些有趣的好处。当修改其中一个元素BindingList或将新元素添加到列表中时,所有绑定控件都会自动更新。您可以使用MovePrevious()、MoveNext()、MoveFirst()、MoveLast()方法来导航 中的元素BindingList(还可以使用其他有用的方法和事件,请参阅有关 BindingSource 功能的文档)。这里,a BindingList<T>(其中T是Member下面所示的类)被设置为BindingSource的DataSource。两者都是Form类的Fields,可以根据需要修改。然后将 BindingSource 用作 ListBox 的 DataSource。Text然后,使用 BindingSource 将两个 TextBox 控件的属性绑定到该类的属性之一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));在实践中,它是这样工作的:https://i.stack.imgur.com/sIlxa.gif 请注意,当修改 TextBox 的 Text 时,ListBox 的当前 Item 会实时更新。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}";}
打开App,查看更多内容
随时随地看视频慕课网APP