簡體   English   中英

將TextBox綁定到ListBox SelectedItem

[英]Binding a TextBox to a ListBox SelectedItem

我目前正在嘗試實現一個相對簡單的數據管理應用程序。

我有一個類MemberBindingList<Member> membersList ,以及一個ListBox和一些TextBox

ListBox綁定到membersList

現在,理想情況下,現在我想將TextBox綁定到ListBox.SelectedItem ,以便用戶在ListBox選擇的任何元素,當他們編輯TextBoxmembersList更新membersList的元素。

我嘗試僅將TextBox es綁定到ListBox.SelectedItem ,但這使BindingListBox.SelectedItem在綁定創建時所引用的實際元素上,而不是在ListBox選擇的任何項目。

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

我實際上已經通過在membersList_SelectedIndexChanged(object sender, EventArgs e)事件處理程序中清除並重新創建TextBoxBindings而解決了這個問題,但這感覺非常“棘手”,我懷疑還有更標准的解決方案。

我的另一個想法是將Binding s設置為membersList_SelectedIndexChanged(object sender, EventArgs e)事件處理程序內設置為ListBox.SelectedItemMember 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));

實際上是這樣的:

BindingSource和BindingList

請注意,修改文本框的文本后,將實時更新列表框的當前項目。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM