XtraGrid单元格值中的LookupEdit变为空白

时间:2011-09-25 17:52:33

标签: c# data-binding devexpress xtragrid

这就是我所拥有的:

public class ViewModel
{
    public BindingList<Row> Rows { get; set; }
    public BindingList<MyElement> Selectables { get; set; }
}

public class Row
{
    public MyElement Selected { get; set; }
}

public class MyElement
{
    public string Value { get; set; }
    public string Friendly { get; set; }
}

这就是我想要的: 一个 XtraGrid ,其列在每个单元格中都有一个组合框编辑器。对于不同的行,下拉选项的值是不同的。具体来说,可用选项是 ViewModel.Selectables 的子集,子集由运行时的业务规则定义。

这就是我尝试实现这一目标的方式:

我创建了三个 BindingSources

  1. viewModelBindingSource DataSource = ViewModel

  2. rowsBindingSource DataSource = viewModelBindingSource AND DataMember = Rows

    < / LI>
  3. selectablesBindingSource DataSource = viewModelBindingSource DataMember = Selectables

  4. 我将网格的DataSource设置为 rowsBindingSource 。 我为网格中的LookupEdit创建了一个就地编辑器存储库。 我将repositoryItemLookUpEdit的{​​{1}}设置为 DataSource 我将selecteablesBindingSource设置为列的repositoryItemLookUpEdit

    我连接到gridViews ColumnEdit 事件:

    ShownEditor

    this.gridView1.ShownEditor += gridView1_ShownEditor; 方法中,我可以引用该视图,以便我可以这样做:

    gridView1_ShownEditor(object sender, EventArgs e)

    这在某种程度上起作用,我在单击的组合框中获得新选项,并选择该选项将值设置为绑定对象,即 GridView view = sender as GridView; var newSelectables = new BindingList<MyElement>(); // businesslogic to populate newSelectables ... var bs = new BindingSource(newSelectables, ""); edit = (LookUpEdit)view.ActiveEditor; edit.Properties.DataSource = bs;

    现在我的问题是,当单元格失去焦点时,单元格内容变为空白

    这似乎是由于我使用new创建了一个新的Row.Selected这一事实,因为如果我省略BindingSource的更改,则 DataSource <改为使用/ em>,它按预期工作。

    那么,有没有人知道为什么在这种情况下失去焦点后,单元格中显示的文字会变成空白?

5 个答案:

答案 0 :(得分:3)

几天前我遇到了同样的问题,但我没有找到任何解决方案。我从中理解的是,binidng到包含ComboEdit或LookupEdit的网格列的值必须与ComboEdit / LookUpEdit Collection的Vlaue Member值匹配。

如果找到匹配的值,它将在单元格中显示显示成员值,否则单元格值将为空白。

这是我从中获得的工作经验。

答案 1 :(得分:3)

我有类似的问题。在我的情况下,问题是由于更改了列中repositoryItemLookupEdit的DataSource属性 当当前行中的新DataSource受到更多限制并且无法显示其他行的值时,这些行中的单元格将变为空白。

要解决此问题, 您可以在以下链接中使用ShownEditor事件和代码示例:
http://documentation.devexpress.com/#WindowsForms/DevExpressXtraGridViewsBaseColumnView_ShownEditortopic

诀窍是, 您不必设置repositoryItemLookupEdit的DataSource,而是将view.ActiveEditor作为LookupEdit并设置其DataSource。然后,其他行不受影响 这是一个代码示例:

void eAdvBandedGridView1_ShownEditor(object sender, EventArgs e)
{
    GridView view = sender as GridView;
    if (view.FocusedColumn.FieldName == "CenterID" && view.ActiveEditor is LookUpEdit)
    {
        LookUpEdit editor = view.ActiveEditor as LookUpEdit; 

        vVoucherItemInfoDTO item = view.GetFocusedRow() as vVoucherItemInfoDTO;

        if (lastFetchedAccount == null || lastFetchedAccount.ID != item.AccountID)
        {
            lastFetchedAccount = accountServiceClient.GetAccountInfo(item.AccountID);
        }
        if (lastFetchedAccount.AllowAllCenters)
            editor.Properties.DataSource = GlobalDataStore.CenterList;
        else
            editor.Properties.DataSource = lastFetchedAccount.AllowedCenterList;

    }
}

答案 2 :(得分:2)

好的,所以我想到了它的一部分。我不确定为什么内容空白。但这与我实例化填充列表newSelectables的新对象的事实有关。 我想当单元格失去焦点时,XtraGrid会转向原始的repositoryItemLookUpEdit,它指向ViewModel.Selectables以获取项目的DisplayValue。由于原始列表中不存在所选项目,因此失败。如果我重用原始对象而不是克隆它们,它似乎有效。

答案 3 :(得分:1)

您可以通过在与组合框关联的编辑器上添加事件处理程序来覆盖此行为。例如

    private void goalTypeEditor_CustomDisplayText(object sender, DevExpress.XtraEditors.Controls.CustomDisplayTextEventArgs e)
    {
        if (e.DisplayText == "")
        {
            string goalTypeId = (string)e.Value;
            RefDataSet refData = ((IParentView)ParentView).RefData;
            string goalTypeLabel = refData.GoalType.FindByGoalTypeID(goalTypeId).Label;
            e.DisplayText = "(No longer in use) " + goalTypeLabel;
        }
    }

答案 4 :(得分:0)

  • 将LookUp的DisplayMember设置为您要显示的列的名称