首页 新闻 会员 周边 捐助

gridcontrol CustomRowCellEdit 事件

0
悬赏园豆:100 [已解决问题] 解决于 2023-12-12 16:43

现在我需要实现一个功能,就是没一行需要实现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 事件一直刷新,导致数据加载不对

犒劳三军的主页 犒劳三军 | 初学一级 | 园豆:112
提问于:2023-11-17 09:33
< >
分享
最佳答案
1

对于第一个问题,即动态加载每行不同的数据,从代码中可以看出,根据 "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 事件只会在首次编辑时触发,避免了多次刷新导致的问题。

收获园豆:100
npe0 | 小虾三级 |园豆:1502 | 2023-12-12 16:25

非常感谢

犒劳三军 | 园豆:112 (初学一级) | 2023-12-12 16:28

@犒劳三军: 是不是可以拿到悬赏了,哈哈哈

npe0 | 园豆:1502 (小虾三级) | 2023-12-12 16:37

@npe0: 可以的

犒劳三军 | 园豆:112 (初学一级) | 2023-12-12 16:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册