DevExpress LookupEdit - 按代码设置选定的DataRow

时间:2011-09-22 10:52:49

标签: c# controls devexpress

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

我有以下代码:

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

对象o是我之前设置的项目,我在循环中找到的PaperSize大小,但对象p为空。

3 个答案:

答案 0 :(得分: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并直接获取编辑值。不知道有什么限制

我不知道还有什么打破,如果有的话,但现在它有效。

答案 1 :(得分:0)

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

拉取基础指定对象

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

答案 2 :(得分:0)

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