组合框显示成员问题,让我疯狂

4

很抱歉打扰您,但我在 C# Winforms 上有一个问题,因为我一直在寻找相同的解决方案,我发现了一些解决方案,但它们对我不起作用。好的,我有一个带有对象的 Bindinglist。

BindingList<objects.usuario> usuarios = new BindingList<objects.usuario>();

这些对象有一些公共的字符串和整数变量,其中一个字符串和一个整数变量是我需要的。

public string dataNombreCompleto;
public int dataIdUsuario;

因此,一旦“usuarios”列表有一些对象,我就这样做。
            cbAdministrativos.DisplayMember = "dataNombre";
            cbAdministrativos.ValueMember = "dataIdUsuario";
            cbAdministrativos.DataSource = usuarios;

事实是,它不起作用,组合框(cbAdministrativos)仍然显示对象。
当我通过调试器进行调试时,在断点之后,组合框按代码设置了display member、value member和数据源,但在下一条指令(方法结束时),我发现display member神奇地变成了""而不是字符串"dataNombre"。
有什么想法吗?
提前感谢,对糟糕的英语表示歉意。
对不起,也感谢大家!在我的绝望中,我尝试使用对象中的不同字段,并且没有意识到在问题的示例代码中我留下了"dataNombre"而不是"dataNombreCompleto",无论如何,那是正确的,那是我原始代码中的原始DisplayMember,但问题仍然存在。

数据名称属性在哪里? - Selman Genç
DisplayMember 应该是 dataNombreCompleto 吗? - OJay
7个回答

9

应该是:

cbAdministrativos.DisplayMember = "dataNombreCompleto";

另外,考虑使用公共属性而不是公共字段。

公共字段是有害的

将此更改为:

public string dataNombreCompleto;
public int dataIdUsuario;

变为:

public string dataNombreCompleto { get; set; }
public int dataIdUsuario { get; set; }

谢谢,我没意识到在示例代码中我写错了值,但问题仍然存在 :( - user2588224
那就是我的问题 - 我原本已经让它工作了,然后把Public Property 改成了 Public Field,结果它就出问题了。我不知道那样做是如此糟糕的做法。谢谢! - derekantrican

3
您需要在您的用户类中使用 getter 和 setter。
string dataNombreCompleto;
     int dataIdUsuario;

  public   string _DataNumComp
     {
         get
         {
             return dataNombreCompleto;
         }
         set
         {

             dataNombreCompleto = value;
         }
     }

  public int _ID
  {
      get
      {
          return dataIdUsuario;
      }
      set
      {

          dataIdUsuario = value;
      }
  }

然后根据需要修改绑定代码。例如,请查看下面给出的代码片段:
        cbAdministrativos.ValueMember = "_ID";
        cbAdministrativos.DisplayMember = "_DataNumComp";
        cbAdministrativos.DataSource = usuarios;

我希望这能解决您的问题。

3
在我的情况下,问题出在设计器中设置为trueSorted属性上。根据文档,当数据绑定开启时设置为true会抛出异常,但是如果你在将Sorted属性设置为true后再设置DataSourceXMember属性,则不会抛出异常,只是默默地不起作用,这会让你抓狂直到你头发都掉光了。

1
谢谢,这帮了我大忙……我差点把头发都掉光了! - T_Bacon

2
你需要设置正确的displayMember名称。尝试这个:
cbAdministrativos.DisplayMember = "dataNombreCompleto";

谢谢,我没意识到在示例代码中我写错了值,但问题仍然存在 :( - user2588224

2
您想设置为“显示成员(Display Member)”和“值成员(Value Member)”的对象是什么?这两个对象是指您问题中提到的吗?
public string dataNombreCompleto;
public int dataIdUsuario;

接下来,您可以将 dataNombreCompleto 设置为 Display Member ,将 dataIdUsuario 设置为 Value Member

cbAdministrativos.DisplayMember = "dataNombreCompleto";
cbAdministrativos.ValueMember = "dataIdUsuario";
cbAdministrativos.DataSource = usuarios;

以下是“Display Member”和“Value Member”的区别:
  • 对于“DisplayMember”属性,它被设计用于在组合框中显示字符串。“ValueMember”则隐藏在“DisplayMember”后面。
  • 对于“ValueMember”属性,它被设计用于获取与下拉列表中的选择相对应的值。
为了更好地理解“DisplayMember”和“ValueMember”属性,您可以参考以下链接:

谢谢,我没意识到在示例代码中我写错了值,但问题仍然存在 :( - user2588224

0

我有类似的问题。尝试先分配数据源:

        cbAdministrativos.DataSource = usuarios;
        cbAdministrativos.DisplayMember = "dataNombre";
        cbAdministrativos.ValueMember = "dataIdUsuario";

0
当设置DataSource属性时,似乎ComboBox会检查DisplayMember是��存在作为一个属性(或者字段?不确定,在这里从未尝试过字段),如果不存在,则ComboBox会清除DisplayMember属性。
如果ComboBox在发生错误时生成异常(及早失败)而不是隐藏错误,那将更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接