开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 3689|回复: 0

SearchLookUpEdit 选择后第一次不显示的怪异问题,附解决方案

[复制链接]

0

精华

206

贡献

76

赞扬

帖子
96
软币
930
在线时间
108 小时
注册时间
2013-9-1
发表于 2017-8-26 14:18:14 | 显示全部楼层 |阅读模式
DevExpress SearchLookUpEdit 选择一项后不显示在Grid中(第一次不显示,之后再选就显示了)问题解决
功能需求:
GridControl中为列A绑定了SearchLookUpEdit,并在 SearchLookUpEidt 的 EditValueChanged 事件中对 GridControl 的其它列进行了赋值,实现选择 LookUpEdit 一项后回填写 GridControl 多列,然后在 GridControl 主 GridView  的 CellValueChanged 事件中对列进行判断是否有汇总,如果有汇总设置则马上更新汇总。
问题描述:
程序运行后发现,每次打开窗口第一次选择SearchLookUpEdit一项后,选择的显示值(DisplayMember)不显示在GridControl上,而其它列正常回填了。
问题动图:

20170826110254.gif
原因分析:
经测试并且分析了Dev的源代码,发现这可能是一个Bug。
原因:SearchLookUpEdit 选择一项后触发了GridControl的CellValueChanged事件,在CellValueChanged事件中访问e.Column.SummaryItem,如果e.Column没有设置汇总(即e.Column.Summary.Count=0),则前面的问题会发生,如果e.Column设置了汇总,则问题不会发生。
经分析Dev的源代码,发现当访问e.Column.SummaryItem时,Dev会首先判断e.Column.Summary.Count是否=0,如果=0则会自动add()一个空SummaryItem并返回这个空的SummaryItem,这样一开始的问题就发生了,而第二次再选择SearchLookUpEdit一项后,因为这时e.Column.Summary.Count>0了,所以不会发生前面的问题。
至于访问e.Column.SummaryItem为什么会造成SearchLookUpEdit的选择的值不显示,没有查到,感觉应该是一个Bug,不管了。
解决方案:
既然我是想在GridControl的CellValueChanged时对汇总值马上计算更新,那我就在CellValueChanged中判断e.Column.Summary.Count>0,而不再用e.Column.SummaryItem.SummaryType != DevExpress.Data.SummaryItemType.None,就解决这个问题了。
附:
Dev的相关代码:
20170826115246.png
附完整代码:
public partial class Form1 : Form
{
    XGDBUtility.SqlHelper db = new XGDBUtility.SqlHelper("server=127.0.0.1;uid=sa;pwd=123;database=demo");

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        var dt = db.GetDataTable("select top 10 djbh,lybmcode,zdr from clkc_cllydj_public");
        gridControl1.DataSource = dt;
        gridView1.CellValueChanged += GridView1_CellValueChanged;

        RepositoryItemSearchLookUpEdit edit = new RepositoryItemSearchLookUpEdit();
        edit.DataSource = db.GetDataTable("select top 10 Name,Guid,zdr from clkc_cllybm");
        edit.DisplayMember = "Name";
        edit.ValueMember = "Guid";
        edit.NullText = "";
        gridView1.Columns["lybmcode"].ColumnEdit = edit;
        edit.EditValueChanged += searchLookUpEdit_EditValueChanged;
    }

    private void GridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
    {
        //此代码会导致SearchLookUpEdit第一次选择时不显示
        //if (e.Column.SummaryItem.SummaryType != DevExpress.Data.SummaryItemType.None)
        //{
        //    gridView1.PostEditor();
        //    gridView1.UpdateCurrentRow();
        //}

        //用此代码解决问题
        if (e.Column.Summary.Count > 0)
        {
            gridView1.PostEditor();
            gridView1.UpdateCurrentRow();
        }
    }

    /// <summary>
    /// GridLookUpEdit回填
    ///  </summary>
    private void searchLookUpEdit_EditValueChanged(object sender, EventArgs e)
    {
        SearchLookUpEdit edit = sender as SearchLookUpEdit;

        string fillRules = "zdr=zdr"; //数据回填规则,应该来源于保存在数据库中的配置信息

        DataRowView rowView = edit.GetSelectedDataRow() as DataRowView;
        GridView gridView = gridView1;

        foreach (string rule in fillRules.Split(','))
        {
            //如:EmployeeGuid=员工内码
            string[] strs = rule.Split('=');
            if (rowView == null)
            {
                gridView.SetFocusedRowCellValue(strs[0], DBNull.Value);
            }
            else
            {
                gridView.SetFocusedRowCellValue(strs[0], rowView.Row[strs[1]]);
            }
        }
    }
}



评分

参与人数 1赞扬 +1 收起 理由
sdzzbin + 1 赞一个

查看全部评分

回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-4-19 01:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表