【问题标题】:DevExpress LookupEdit - setting the selected DataRow by codeDevExpress LookupEdit - 通过代码设置选中的DataRow
【发布时间】:2011-09-22 10:52:48
【问题描述】:

我知道还有其他类似的问题,但他们的解决方案对我不起作用。

我有以下代码:

     lueSizes.Properties.DataSource = new BindingSource(PS.PaperSizes, null);
     lueSizes.Properties.Columns.Add(new LookUpColumnInfo("PaperName", "Größe"));
     lueSizes.Properties.DisplayMember = "PaperName";
     lueSizes.Properties.ValueMember = "PaperName";

     //PS is a regular System PrinterSettings object
     foreach (PaperSize size in PS.PaperSizes)

         //I confirmed with debugging that this actually happens correctly
         if (size.RawKind == binSettings.SizeRawKind)
          {
              lueSizes.EditValue = size;
              break;
          }

使用 DataSource 填充 LookupEdit 工作正常,用户可以从下拉列表中选择所需的 PaperSize,并且

lueSizes.GetSelectedDataRow() as PaperSize

然后按预期返回一个 PaperSize 对象。

我遇到的问题是设置 EditValue,它什么也没做。我已经验证,在运行时,DataSource 包含 PS.PaperSizes 中的所有 PaperSize 对象,包括在 foreach 循环中找到的对象。但设置 EditValue = size 并不会导致所选数据行相应更新。

我尝试过的其他变体是:

lueSizes.EditValue = size.PaperName;

lueSizes.EditValue = lueSizes.Properties.GetKeyValueByDisplayText(size.PaperName);

lueSizes.EditValue = lueSizes.Properties.GetKeyValueByDisplayValue(size.PaperName);

lueSizes.EditValue = lueSizes.Properties.GetKeyValueByDisplayValue(size);

lueSizes.EditValue = 0;

这些都不做任何事情,选定的数据行保持 NULL 并且不向用户显示任何内容。

我还能尝试通过代码设置选定的 DataRow 吗?

编辑:

    private void lueSizes_EditValueChanged(object sender, EventArgs e)
    {
        object o = lueSizes.EditValue;
        object p = lueSizes.GetSelectedDataRow();
        PaperSize size = o as PaperSize;
        UpdateSize(size);
    }

object o是我之前设置的item,是我在循环中找到的PaperSize大小,但是object p是null。

【问题讨论】:

  • 你试过 RefreshDataSource
  • @username 否,因为数据源在声明后不会更改,并且因为 LookupEdit 首先没有该方法。

标签: c# controls devexpress


【解决方案1】:

我想我至少找到了解决方法:


BindingSource bindingSource = new BindingSource(PS.PaperSizes, null);
lueSizes.Properties.DataSource = bindingSource;
lueSizes.Properties.Columns.Add(new LookUpColumnInfo("PaperName", "Größe"));
lueSizes.Properties.DisplayMember = "PaperName";

foreach (PaperSize size in bindingSource)
    if (size.RawKind == BinSettings.SizeRawKind)
    {
        lueSizes.EditValue = size;
        break;
    }

private void lueSizes_EditValueChanged(object sender, EventArgs e)
{
    PaperSize size = lueSizes.EditValue as PaperSize;
    Update(size);
}

首先,我在 BindingSource 中进行循环搜索,我现在必须明确定义它,而不是 Printersettings 对象。

接下来,我可能不会设置 DisplayValue 属性。

最后,我避免查找 DataRow 并直接查找编辑值。不知道有什么限制

我不知道还有什么问题,如果有的话,但现在它可以工作。

【讨论】:

    【解决方案2】:

    我知道这是一个旧线程,但我遇到了同样的问题。接受的答案不是最佳实践,因为我们的目标是获取所选对象而不是键值。解决方法是在 EditValueChangedEvent 被触发后立即调用 lookupEdit.Properties.ForceInitialize(),然后 GetSelectedDataRow() 应该可以工作。如果没有通过鼠标更改lookupEdit,这将解决问题。

    【讨论】:

    • 我在我的表单(包含此控件)的构造函数中添加了lookupEditSelector.Properties.ForceInitializ(),使其工作。谢谢
    【解决方案3】:

    您必须确保指定的值存在于 lookupEdit 的数据源中,
    然后尝试直接设置.Text 属性

    拉取底层分配的对象

    PaperSize  selectedPS = (PaperSize)lueSizes.Properties.GetDataSourceRowByDisplayValue(lueSizes.Text)
    

    【讨论】:

    • 添加 lueSizes.Text = size.PaperName;或用它替换“editvalue =”行什么都不做。 GetSelectedDataRow() 不断返回 NULL。
    • 不,正如我所写的,它什么也没做。显示给用户的行仍然是“[EditValue is null]”
    • 如果EditValue is null那么赋值的值在原始数据源中不存在!加上GetSelectedDataRow方法在DevExpress.XtraEditors.LookUpEdit方法中不存在!你使用什么版本的 DevExpress?无论如何,请查看我的帖子以获取更多更新
    • 我使用的是 10.2.8,GetSelectedDataRow() 是这样的:documentation.devexpress.com/#WindowsForms/… 我在运行时检查了数据源,它确实包含 PS.PaperSizes 中的所有 PaperSize 对象,包括在 foreach 循环中找到。我只是不知道为什么它不被接受为 EditValue
    • 我已经说过,拉出当前选定的 PaperSize 没有问题,如何做到这一点也不是我的问题。如果用户从列表中选择了一个项目,则 GetSelectedDataRow() as PaperSize 可以正常工作。我的问题是,如何通过代码选择一个项目?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多