为什么ValueMember会覆盖空的DisplayMember

时间:2017-09-22 12:35:39

标签: c# winforms objectdatasource

当我在控件上设置# Read files $File1 = Get-Content <file1> $File2 = Get-Content <file2> # Process each line Foreach ($Line in $File1) { # Get only the filename for current line $FileName = $Line.Split("\")[-1] # Replace filename in file2 with the entire line of file1 $File2 = $File2 -replace $Filename,$Line } # Write new content to file2 Set-Content -Path <file2> -Value $File2 并希望将DataSource用作.ToString()时,我需要设置DisplayMember最后一个或DisplayMember将覆盖它。

MSDN on empty string as display member:

  

从ListControl继承的控件可以显示不同类型的对象。如果对象上不存在指定的属性,或者DisplayMember的值为空字符串(&#34;&#34;),则会显示对象的ToString方法的结果。

要重现的代码:

类别:

ValueMember

表格:

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}";
    }
}

您可以通过制作新表单并添加2个组合框来尝试。

结果:

enter image description here

结论和问题:

通过以正确的顺序设置它们可以轻松解决这个问题但是这很容易出错,如果我使用实际属性作为DisplayMember而不是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 = ""; / "",它也不会显示此行为

我真的想知道为什么它会显示这种行为,如果我可以将ToString显式设置为DisplayMember(代码清晰度)。

1 个答案:

答案 0 :(得分:2)

我在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;

所以现在我们已经找到了问题的根源