- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我设置 DataSource
在控件上并想使用 .ToString()
作为DisplayMember
, 我需要设置 DisplayMember
最后一个或 ValueMember
将覆盖它。
MSDN on empty string as display member:
The controls that inherit from ListControl can display diverse types of objects. If the specified property does not exist on the object or the value of DisplayMember is an empty string (""), the results of the object's ToString method are displayed instead.
重现代码:
类:
class SomeClass
{
public string PartA { get; set; }
public string PartB { get; set; }
public string WrongPart { get { return "WRONG"; } }
public override string ToString()
{
return $"{PartA} - {PartB}";
}
}
形式:
var testObj = new SomeClass() { PartA = "A", PartB = "B" };
comboBox1.DataSource = new [] { testObj };
comboBox1.DisplayMember = "";
comboBox1.ValueMember = "WrongPart";
comboBox2.DataSource = new[] { testObj };
comboBox2.ValueMember = "WrongPart";
comboBox2.DisplayMember = "";
您可以尝试创建一个新表单并添加 2 个组合框。
结果:
结论和问题:
这可以通过以正确的顺序设置它们来轻松解决,但是这很容易出错,如果我使用实际属性作为 DisplayMember 而不是 ""
,它也不会显示此行为/ToString
.
我真的很想知道为什么它会显示这种行为,以及我是否可以设置 .ToString()
显式显示为 DisplayMember(为了代码清晰)。
最佳答案
我在 the reference source 中搜索过并发现了这一点:
if (!newValueMember.Equals(valueMember)) {
// If the displayMember is set to the EmptyString, then recreate the dataConnection
//
if (DisplayMember.Length == 0)
SetDataConnection(DataSource, newValueMember, false);
SetDataConnection 方法签名:
private void SetDataConnection(object newDataSource, BindingMemberInfo newDisplayMember, bool force)
这会设置一个新的 DisplayMember
displayMember = newDisplayMember;
现在我们已经找到了问题的根源
关于c# - 为什么 ValueMember 会覆盖一个空的 DisplayMember,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46364985/
我有一个列表框,其中绑定(bind)了一个数据表。数据表有两列,“CMM”和“位置”。 “CMM”是一个/两位整数,用作列表框的 DisplayMember,“Location”是一个一位整数,等于
假设我正在使用这样的数据绑定(bind): List Entities = entityBinding.DataSource = Entities; lstEntities.DisplayMembe
我正在尝试获取一个 ListBox 来显示 Accommodation 表的多行的串联。 因为我无法编辑数据源,所以我准备了一个类 AccommodationEntity,它包含原始的 Accommo
我在 Windows 窗体上有一个组合框,我试图用客户端列表填充它。我有一个包含三个值的元组列表 ( var clients = new List>(); ) 我正在从返回 clientID 的 SQ
我使用 Windows 窗体。我想要来自基类的 DisplayMember 相等属性?我有课 public class MyViewModel { public int Id { get; s
我需要在一个组合框中显示多条数据,但我不知道该怎么做。 这是我正在努力工作的代码: innerBox.DisplayMember = @"t => t.TenantName + ""\
我有一个正在填充的 ComboBox,其中 ComboBox.Items 中的每个对象都是一个对象列表。目前,ComboBox 为每个项目显示“(Collection)”。 是否可以让 ComboBo
这个问题涉及一个极小的 Winforms GUI。让大家知道我具有数据绑定(bind)和 INotifyPropertyChanged 的基本知识,并且在 WPF 的 ViewModel 中使用了
我有这个方法可以将 Conta 实例添加到名为“comboContas”的 ComboBox 中: public void AdicionaConta(Conta novaConta) { c
我将 DatagridViewComboBoxColumn 绑定(bind)到数据源,我想在列表和显示成员中显示“名字”+“姓氏”。我该怎么做? 最佳答案 向公开“名称”的数据源添加一个属性。让“姓名
我目前对 C# 还很陌生,我的大部分知识都来自 Java 和 Python。话虽如此,我目前有以下代码: public class Person { public int Person_ID
我正在尝试做一些非常简单的事情 - 将 CheckedListBox 绑定(bind)到对象列表。 Class definition namespace Models { public cla
我的选中列表框有问题。 public void GetFolder() { var dict = new Dictionary(); foreach (Fo
如何设置这些值?我有一个数据表,其中包含我想在组合框中设置的所有数据,但我找不到如何设置它。 我试过了 ComboBox1.DataSource = dataTable; ComboBox1.Valu
当我设置 DataSource在控件上并想使用 .ToString()作为DisplayMember , 我需要设置 DisplayMember最后一个或 ValueMember将覆盖它。 MSDN
目的是将列表视为“名称”列表。 这是字典: class Scripts { public Dictionary scripts = new Dictionary();
我正在尝试将 Windows 窗体项目中 ListBox 的 DisplayMember 属性设置为我绑定(bind)到的通用列表中的嵌套类的属性。 这是一个简单的例子: public class
我尝试在我的 ListBox 组件中将“FirstName”和“LastName”属性显示在同一行,例如“SMITH Robert”,但是当我启动程序时,我有 Id 属性。问题可能是程序没有找到属性“
我正在尝试使用以下代码更改组合框的显示方式: private void UpdateMapRoadPointList(List plstMapRoadPointList) {
当我有一个 DataGridViewComboBoxColumn填充绑定(bind)值,如果我设置 DisplayMember属性,我得到 DataError使用 FormatException 引发
我是一名优秀的程序员,十分优秀!