4

这就是我所拥有的:

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 = viewModelBindingSourceDataMember = Rows

  3. selectablesBindingSourceDataSource = viewModelBindingSource_DataMember = Selectables

我将网格设置DataSourcerowsBindingSource. 我为网格中的 LookupEdit 创建了一个就地编辑器存储库。我将repositoryItemLookUpEdit's设置DataSourceselecteablesBindingSource 我将 's 设置repositoryItemLookUpEdit为列的ColumnEdit

我连接到 gridViewsShownEditor事件:

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;

这适用于我在单击的组合框中获得新选项,并选择该选项将值设置为绑定对象,即Row.Selected.

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

这似乎是由于我BindingSource用 new 创建了一个 new 的事实,因为如果我省略了这个更改,DataSource那么将ViewModel.Selectables使用 in 的值,并且它按预期工作。

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

4

5 回答 5

3

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

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

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

于 2011-09-27T06:03:44.937 回答
3

我有一个类似的问题。在我的情况下,问题是由于更改了列中 repositoryItemLookupEdit 的 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;

    }
}
于 2012-06-27T23:49:22.680 回答
2

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

于 2011-09-26T17:00:40.520 回答
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;
        }
    }
于 2012-01-20T11:11:54.170 回答
0
  • 将 LookUp 的 DisplayMember 设置为您要显示的列的名称
于 2013-11-26T09:04:07.637 回答