【问题标题】:Different Value Member, same control不同的值成员,相同的控制
【发布时间】:2010-11-03 09:46:47
【问题描述】:

编辑 1

我相信我的问题源于以下几点。填充下拉部分的函数将显示成员设置为 CountyName。然后,当我按照建议尝试设置 SelectedText 或 EditValue 时,该函数仅返回它尝试与下拉列表 DisplayMember 中的内容匹配的 CountyID。我需要它来匹配 ValueMember 列表中的内容。

使用以下方法我让它工作了,但它是一个 HACK,我非常感谢找到一个真正的解决方案。

lkuResidenceCounty.ItemIndex = Convert.ToInt32(row["ResidencyCountyID"].ToString());

原帖

我在成员表单上有一个查找框(DevExpress),我使用此代码从数据库中填写可能的值 -->

        lkuResidenceCounty.Properties.DataSource = ConnectBLL.BLL.Person.CountyList();
        lkuResidenceCounty.Properties.PopulateColumns();
        lkuResidenceCounty.Properties.DisplayMember = "CountyName";
        lkuResidenceCounty.Properties.ValueMember = "CountyID";
        lkuResidenceCounty.Properties.Columns[0].Visible = false;
        lkuResidenceCounty.Properties.Columns[2].Visible = false;
        lkuResidenceCounty.Properties.Columns[3].Visible = false;

这很好用,因为 CountyName 会按预期显示。

但是,当我尝试使用以下内容为该字段加载现有成员的值时,这是从数据集中获取一行的函数的一部分 -->

lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();

我得到一个空白框。我已单步执行代码,并且正在为会员返回正确的 ID。

不幸的是,填充下拉选项的存储过程从维护表中提取,其中包含“CountyName”和“CountyID”列。所以这是正确的。不幸的是,加载特定人员的当前县的存储过程从 Person Table 中提取,其中有一个名为“ResidencyCountyID”的列。之所以这样命名,是因为还有一个“ResponsibilityCountyID”列。

我需要一种让它们共存的方法,有什么解决方案吗?

谢谢!

【问题讨论】:

    标签: c# .net winforms data-binding devexpress


    【解决方案1】:

    为什么需要相同的 LookUpEdit 才能拥有两个值成员?它是独立使用还是在网格中使用?如果是独立的,您可以根据当前行交换两个存储库编辑器。但是,ValueMember 是否有超过 2 个可能的值?这也会使事情复杂化。

    更新

    看了你的编辑,我想我更了解发生了什么。那么,您不希望更改您的 ValueMember(指数据列),而是更改编辑器的值?如果是这样,那么您绝对应该使用 EditValue(不是 SelectedText,我不认为它应该被设置),并将其分配给 row["value_field"],如下所示:

    lkuResidenceCounty.EditValue = row["ResidencyCountyID"];
    

    当你这样做时会发生什么?

    【讨论】:

      【解决方案2】:

      DisplayMember 和 ValueMember 用于使用可选值列表填充控件。要设置填充的 LookUpEdit 控件的选定值,请设置其EditValue 属性:

      lkuResidenceCounty.EditValue = row["ResidencyCountyID"].ToString();
      

      响应您的编辑:根据文档:

      当前选定的行决定了编辑器的编辑值和显示文本的值。 BaseEdit.EditValue 的值是从 RepositoryItemLookUpEditBase.ValueMember 字段中获取的,而要在编辑框中显示的文本是从所选行的 RepositoryItemLookUpEditBase.DisplayMember 字段中获取的。

      当你改变 BaseEdit.EditValue 时, 编辑器定位并选择行 谁的 RepositoryItemLookUpEditBase.ValueMember 字段包含新值。文本 在编辑框中更改为反映 新选择的行。

      我不使用这些控件,但在我看来它不应该像您描述的那样工作。我认为 ToString() 是问题所在,因为 EditValue 接受一个对象,因此它可能需要一个 int 作为值。试试:

      lkuResidenceCounty.EditValue = (int)row["ResidencyCountyID"];
      

      【讨论】:

      • 见上面的编辑,我会详细说明。
      【解决方案3】:

      ValueMember 属性告诉列表在设置 Value 属性时要从哪个字段中提取。将 ValueMember 设置为“CountyID”后,当列表为 Databound 时,它会将所有列表项的值属性设置为其对应对象的 CountyID 字段。

      因此,你不应该这样做:

      lkuResidenceCounty.Properties.ValueMember = row["ResidencyCountyID"].ToString();
      

      而是

      lkuResidenceCounty.Properties.ValueMember = "CountyID";
      

      非常好,只要您正确识别了您尝试数据绑定的字段。列表获取数据绑定后,您应该会看到预期的结果。

      但是,在查看您的代码之后,您的字段似乎不匹配。在一个地方您使用 ResidencyCountyID,而在另一个地方您使用 CountyID。这很可能是你困惑的根源。弄清楚实际的字段名称是什么,并确保将 ValueMember 设置为该名称。

      更新

      阅读您的评论后,您要查找的是 SelectedValue 属性。 SelectedValue 属性告诉列表将所选值强制为您提供的任何输入。

      基本上你有两件事在这里发生。 ValueMember 告诉列表使用什么作为数据源中的值,SelectedValue 告诉列表当前选择的值应该是什么。

      【讨论】:

      • 两个场景的字段名称不同。对于可能值的填充是从县维护表中提取的,当前成员信息的填充是从成员表中。
      • @Refracted Paladin 哦,我想我现在明白了。我更新了我的答案,但基本上你想使用 SelectedValue 属性。
      • @Refracted Paladin lkuResidenceCounty是个什么样的控件?
      • @Refracted Paladin Ah 那么你可能想试试 SelectedText 属性,看看它是否可以代替 SelectedValue。
      • 我认为如果我的存储过程返回的是 DisplayMember 而不是 ValueMember。听起来我可能遇到了 DevExpress 独有的问题,我怀疑,我只是希望我能在这里和那里找到帮助,因为它不是最好的支持网站。
      猜你喜欢
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2015-06-20
      相关资源
      最近更新 更多