为了账号安全,请及时绑定邮箱和手机立即绑定

将文本框绑定到列表框 SelectedItem

将文本框绑定到列表框 SelectedItem

C#
德玛西亚99 2023-07-22 16:29:44
我目前正在尝试实现一个相对简单的数据管理应用程序。我有一个 classMember和 a BindingList<Member> membersList,以及 aListBox和一些TextBoxes 。是ListBox必然的membersList。现在,理想情况下,我希望将TextBoxes 绑定到ListBox.SelectedItem,以便用户在 中选择的任何元素在ListBox编辑TextBox中的元素时membersList都会更新。我尝试将TextBoxes 绑定到ListBox.SelectedItem,但这使得 成为绑定创建时引用的Binding实际元素,而不是 中选择的任何项目。ListBox.SelectedItemListBoxfirstNameTextBox.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命名空间中。我想我正在使用后者的类。也许我应该使用另一个?)
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

正如评论中所述,将BindingList(或 DataTable)与BindingSource关联起来可以带来一些有趣的好处。

当修改其中一个元素BindingList或将新元素添加到列表中时,所有绑定控件都会自动更新。

您可以使用MovePrevious()MoveNext()MoveFirst()MoveLast()方法来导航 中的元素BindingList(还可以使用其他有用的方法和事件,请参阅有关 BindingSource 功能的文档)。

这里,a BindingList<T>(其中TMember下面所示的类)被设置为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}";

}


查看完整回答
反对 回复 2023-07-22
  • 1 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信