这就是我所拥有的:
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
viewModelBindingSource
: DataSource = ViewModel
rowsBindingSource
: DataSource = viewModelBindingSource
AND DataMember = Rows
selectablesBindingSource
与 DataSource = viewModelBindingSource
和 DataMember = Selectables
我将网格的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>,它按预期工作。
那么,有没有人知道为什么在这种情况下失去焦点后,单元格中显示的文字会变成空白?
答案 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)