当我在控件上设置DataSource
并想将.ToString()
用作DisplayMember
时,我需要最后设置DisplayMember
,否则ValueMember
将覆盖它。
MSDN on empty string as display member:
复制代码:
类(class):
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/