当前位置:   article > 正文

gridControl在同一列的不同行创建不同的控件(已CheckEidt搭配ButtonEdit为例)_dev gridview同一列不同控件

dev gridview同一列不同控件

近几日,在项目中,需要实现一个如下功能:

先放截图:

根据标识SpecFlag,在gridControl中,分别生成CheckEidt和ButtonEdit。

1.思路分析

根据经验,此类设计需要在代码中进行控件的创建,并为其设置相应的事件。在代码中,根据SpecFlag进行不同控件的创建,CheckEidt和ButtonEidt的创建方式与上篇单列全部使用RepositoryCheckEdit介绍的方式相似。

2.实现过程

1.声明全局变量

  1. DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit riCheck;
  2. DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit riButton;

其实也可以在,创建部分进行声明,声明地点无所谓。

2.控件创建部分

  1. /// <summary>
  2. /// 根据specflag构造列中的按钮或checkedit
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void gridView_data_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
  7. {
  8. if (e.Column.Name=="SpecFlag")
  9. {
  10. SpecialFormInfoModel model = gridView_data.GetRow(e.RowHandle) as SpecialFormInfoModel;
  11. if (!string.IsNullOrEmpty(model.SpecFlag) && (model.SpecFlag == "CLL-S"/*单套载重*/ || model.SpecFlag == "CLL-M"/*多套载重*/ || model.SpecFlag == "CEX-M"/*免除*/))
  12. {
  13. riButton = this.repositoryItemButtonEdit;
  14. e.RepositoryItem = riButton;
  15. }
  16. else
  17. {
  18. riCheck = new DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit();
  19. riCheck.NullStyle = DevExpress.XtraEditors.Controls.StyleIndeterminate.Unchecked;
  20. riCheck.ValueGrayed = false;
  21. riCheck.QueryCheckStateByValue -= riCheck_QueryCheckStateByValue;
  22. riCheck.QueryCheckStateByValue += riCheck_QueryCheckStateByValue;
  23. riCheck.QueryValueByCheckState -= riCheck_QueryValueByCheckState;
  24. riCheck.QueryValueByCheckState += riCheck_QueryValueByCheckState;
  25. riCheck.CheckedChanged += riCheck_CheckedChanged;
  26. e.RepositoryItem = riCheck;
  27. }
  28. }
  29. }

3.部分事件代码

  1. /// <summary>
  2. /// checkedit的值转换
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. void riCheck_QueryValueByCheckState(object sender, DevExpress.XtraEditors.Controls.QueryValueByCheckStateEventArgs e)
  7. {
  8. switch (e.CheckState)
  9. {
  10. case CheckState.Checked:
  11. e.Value = "True";
  12. break;
  13. case CheckState.Indeterminate:
  14. e.Value = "False";
  15. break;
  16. case CheckState.Unchecked:
  17. e.Value = "False";
  18. break;
  19. default:
  20. break;
  21. }
  22. e.Handled = true;
  23. }
  24. void riCheck_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
  25. {
  26. string val = "";
  27. if (e.Value!=null)
  28. {
  29. val = e.Value.ToString();
  30. }
  31. else
  32. {
  33. val = "False";
  34. }
  35. switch (val)
  36. {
  37. case "True":
  38. e.CheckState = CheckState.Checked;
  39. break;
  40. case "False":
  41. e.CheckState = CheckState.Unchecked;
  42. break;
  43. default:
  44. break;
  45. }
  46. e.Handled = true;
  47. }

到此,标题所要实现的功能已经完成。但是!!!我在实现,双击右侧grid数据,将左侧相应数据的check状态取消的时候,发现,左侧CheckEdit的状态无法更新,即其实际状态为UnCheck的时候,界面已然是勾选状态,这个问题搞的我持续懵逼啊,经过一轮百度和测试,就在快要放弃的时候,找到了解决方案。。。。。。。,重点来了,重点来了,重点来了。

先上代码

  1. /// <summary>
  2. /// 双击已选列表删除本次添加数据
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. void gridView_selected_DoubleClick(object sender, EventArgs e)
  7. {
  8. CommSelectorModel curModel = this.gridView_selected.GetFocusedRow() as CommSelectorModel;
  9. if (curModel.IsWorkForm == "0")
  10. {
  11. selectedList.Remove(curModel);
  12. this.listData.FirstOrDefault(o => o.Id == curModel.ID && o.FormCode == curModel.FormCode).SpecFlag = "False"; //最重要的一句,即产生作用的一句
  13. }
  14. RefreshSel();
  15. }

原因是:

CheckedChanged触发后并未立即更新到数据源,因此勾选的该行状态在数据源中还是True,只有在焦点离开相应行时,才能更新到数据源。但是,此时,界面焦点在右侧grid,所以导致数据如法更新,必须手动更新才行。

所以直接将数据源中需要改变状态的行的标识修改为False即可。(因为选中时,是直接点击的CheckEdit,值会自动更新)

若不太明白,看一下:

若在绑定数据源的情况下实现只可单选,可以通过循环每行的状态来实现。

  1. /// <summary>
  2. /// 选择状态改变触发事件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void repositoryItemCheckEditKey_CheckedChanged(object sender, EventArgs e)
  7. {
  8. DataTable dt = gridControlDetial.DataSource as DataTable;
  9. for (int i = 0; i < dt.Rows.Count; i++)
  10. {
  11. dt.Rows[i][0] = false;
  12. }
  13. gridControlDetial.RefreshDataSource();
  14. }

若还不是很明白,建议动手写个demo,打断点手动调试一下,根据运行前后和结果会很清晰的帮助你理解。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/309532
推荐阅读
相关标签
  

闽ICP备14008679号