- 积分
- 82
- 在线时间
- 110 小时
- 主题
- 8
- 注册时间
- 2013-9-1
- 帖子
- 97
- 最后登录
- 2024-9-25
- 帖子
- 97
- 软币
- 941
- 在线时间
- 110 小时
- 注册时间
- 2013-9-1
|
DevExpress SearchLookUpEdit 选择一项后不显示在Grid中(第一次不显示,之后再选就显示了)问题解决
功能需求:
GridControl中为列A绑定了SearchLookUpEdit,并在 SearchLookUpEidt 的 EditValueChanged 事件中对 GridControl 的其它列进行了赋值,实现选择 LookUpEdit 一项后回填写 GridControl 多列,然后在 GridControl 主 GridView 的 CellValueChanged 事件中对列进行判断是否有汇总,如果有汇总设置则马上更新汇总。
问题描述:
程序运行后发现,每次打开窗口第一次选择SearchLookUpEdit一项后,选择的显示值(DisplayMember)不显示在GridControl上,而其它列正常回填了。
问题动图:
原因分析:
经测试并且分析了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的相关代码:
附完整代码:
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]]);
}
}
}
}
|
评分
-
查看全部评分
|