【问题标题】:Winforms, databinding, Listbox and textboxWinforms、数据绑定、列表框和文本框
【发布时间】:2010-05-25 12:46:59
【问题描述】:

我的屏幕上有一个列表框 (MyListBox) 和一个文本框 (MyTextBox)。

ListBox 中填充了一个 List(Of T),这些都是自定义项。

现在我尝试这样做:

ListBox 的数据源是 List(Of T)。

现在,当项目更改时,我希望将文本框更新为列表框中所选项目的特定属性。

在代码中这意味着:

Me.MyListBox.DisplayMember = "SelectionName"
Me.MyListBox.ValueMember = "Id"

MyTextbox.DataBindings.Add(New Binding("Text", Me._listOfItems, "SelectedItem.Comment", True, DataSourceUpdateMode.OnPropertyChanged))

Me.MyListBox.DataSource = Me._listOfItems

这不起作用。但是当我绑定到 SelectedValue 而不是 SelectedItem 时,它可以完美运行。

_listOfItems 声明如下:

Dim _listOfItems As List(Of MyItem) = New List(Of MyItem)()

MyItem 在哪里:

public class MyItem
{
    public string SelectionName { get; set; }
    public int Id { get; set; }
    public string Comment { get; set; }
}

我尝试覆盖 MyItem 中的 ToString() 以便它使用它。但这也不起作用。

有人愿意试一试吗?

【问题讨论】:

    标签: c# vb.net winforms data-binding


    【解决方案1】:

    我想,最简单的方法之一是使用BindingSource,将其设置为ListBox.DataSource 属性,并设置为您的BindingSource 设计。

    1. 在您的表单上添加BindingSource
    2. ListBox.DataSource 属性设置为BindingSource
    3. 像实际操作一样设置ValueMemberDisplayMember 属性;
    4. 将您的DataBinding 设为您的TextBox 控件,并使用您的BindingSource 作为源,使用您的MyItem.Comment 属性;
    5. 将您的 List(Of MyItem) 分配给您的 Binding.DataSource 属性;
    6. 您的 TextBox 应遵循 CurrencyManager.CurrentItem 的 Comment 属性,即当前的 ListBox.SelectedItem

    确实,您可能需要实现INotifyPropertyChanged 接口才能使其正常工作。

    但是,如果这一切都与 SelectValue 完美配合,您为什么不直接使用它呢?

    【讨论】:

    • SelectedValue 是 Id,我需要注释。而且我不能用它来调用数据库:) 我会试试你的解决方案!
    • 我明白了!你是对的,如果你想要为用户提供一个选择选项,我们不要用 ID 来做。 =P
    • 不需要选项 5 :) 和选项 4:我使用这个绑定: new Binding("Text", bindingSource1, "Comment", ...) 因为它已经使用了 .Current 属性绑定源!谢谢!
    【解决方案2】:

    下面的代码显示了我是如何做到的。我首先将我的 ListBox DataSource 设置为具有 BindingList 集合的类。该类实现 IBindingList。我有两个要将 SelectedItem 绑定到的文本框。下面的代码是我的做法:

    lbControl.DataSource = SharepointTestBusinessLayer.Control.ListAll();
    lbControl.DisplayMember = "ControlName";
    lbControl.SelectedIndex = 0;
    scTextBoxControlID.DataBindings.Add("Text", this.lbControl.DataSource, "ControlID");
    scTextBoxControlName.DataBindings.Add("Text", this.lbControl.DataSource, "ControlName");
    

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多