gpt4 book ai didi

c# - 为什么 ValueMember 会覆盖一个空的 DisplayMember

转载 作者:太空狗 更新时间:2023-10-29 23:36:26 25 4
gpt4 key购买 nike

当我设置 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 个组合框。

结果:

enter image description here

结论和问题:

这可以通过以正确的顺序设置它们来轻松解决,但是这很容易出错,如果我使用实际属性作为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com