现在我需要实现一个功能,就是没一行需要实现text comboBox 或者 lookupedit 控件 没行的数据源不一样,但是在加载comboBox的时候,数据源加载很混乱,且加载的不对
前台的一些设置
下面是我后台的代码 ,用的CustomRowCellEdit 事件,这个时间有一个问题,就是感觉后台一直不停的在刷新,这个怎么解决
DevExpress.XtraEditors.Repository.RepositoryItemComboBox cbb;
DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit be;
DevExpress.XtraEditors.Repository.RepositoryItemLookUpEdit lue;
DevExpress.XtraEditors.Repository.RepositoryItemTextEdit te;
DevExpress.XtraEditors.Repository.RepositoryItemTextEdit tn;
private void gvSummery_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
{
if (e.Column.FieldName == "SETVALUE")
{
DataRow drSet = this.gvSummery.GetDataRow(e.RowHandle);
string de = drSet["VALUE_TYPE"].ToString();
string lists = drSet["VALUELIST"].ToString();
string source = drSet["VALUESOURCE"].ToString();
if (de == "Number")
{
tn = txtNumber;
//txtInput.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx;
//txtInput.Mask.EditMask = "([0-9]{1,}[.][0-9]*)";
e.RepositoryItem = tn;
}
else if (de == "ComboBox")
{
cbb = txtSelect;
cbb.Items.Clear();
string[] sp = lists.Split(',');
foreach(var ep in sp)
{
if (!string.IsNullOrEmpty(ep))
cbb.Items.Add(ep);
}
e.RepositoryItem = cbb;
}
else if (de == "DataTable")
{
be = btnInput;
btnInput.Click += btnInput_Click;
btnInput.Click -= btnInput_Click;
e.RepositoryItem = be;
}
else if (de == "Text")
{
te = txtInput;
e.RepositoryItem = te;
}
}
}
请问这两个问题如何解决,一个是动态没行加载不同的数据,二是,CustomRowCellEdit 事件一直刷新,导致数据加载不对
对于第一个问题,即动态加载每行不同的数据,从代码中可以看出,根据 "VALUE_TYPE"
字段使用不同类型的 RepositoryItem
。然后,再根据值列表或者值源来填充数据。所以,这部分代码应该没有问题。
对于第二个问题,即 CustomRowCellEdit
事件一直刷新导致数据加载不对,可能的原因是每次单元格编辑时都会触发该事件。需要在方法体内部加上一些条件判断,避免不必要的重复刷新。
下面是一种可能的解决方案:
private void gvSummery_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
{
if (e.Column.FieldName != "SETVALUE" || e.ListSourceRowIndex < 0)
return;
DataRow drSet = this.gvSummery.GetDataRow(e.RowHandle);
string de = drSet["VALUE_TYPE"].ToString();
//...省略原有代码...
// 添加修改标记,避免重复调用
if (!drSet.Table.Columns.Contains("IsEdited"))
drSet.Table.Columns.Add("IsEdited", typeof(bool));
bool isEdited = drSet["IsEdited"] == DBNull.Value ? false : Convert.ToBoolean(drSet["IsEdited"]);
if (isEdited)
return;
// 下面是原有的代码...
}
以上代码首先检查字段名是否为 "SETVALUE"
且 list source row index 是否有效,如果不符合条件就直接返回。
然后,检查是否已经对该行进行过编辑。这是通过添加一个 "IsEdited"
字段来实现的。如果已经编辑过,就不再进行后续的操作。
这样, CustomRowCellEdit
事件只会在首次编辑时触发,避免了多次刷新导致的问题。
非常感谢
@犒劳三军: 是不是可以拿到悬赏了,哈哈哈
@npe0: 可以的