winform GridControl 总结

winfrom GridControl总结

一、GridControl和GridView的关系

  • GridControl表示网格控件,网格控件使用视图(如 GridView、BandedGridView)来显示数据。
  • GridControl 相当于容器,GridView 相当于容器中的可视化组件,一个GridControl网格控件里面可以有多个视图。类似于 Excel 表格文件 与工作表 Sheet 的关系。

二、绑定数据源

  • 点击 RunDesigner
  • 增加列 Column

image-20220409101230040

  • 与DataTable 绑定数据

image-20220409102146457

  • 数据填充
  DataTable dt = new DataTable();
            dt.Columns.Add("gc1", typeof(string)); // DaTaTable 增加列,确定 列名和 列的数据类型
            dt.Columns.Add("gc2", typeof(string));
            dt.Columns.Add("gc3", typeof(string));
      
            dt.Rows.Add("张三", "男", "18" );// 增加行
            dt.Rows.Add("李四", "男", "22");
            dt.Rows.Add("小芳", "女", "22");
            this.gridControl1.DataSource = dt;

三 、外观设计

3.1 表头和数据居中显示

image-20220409103132389

3.2 合并单元格
  • 相邻两行的值相同才会单元格合并

image-20220409103636451

3.3 左侧的多选框

image-20220409104555785

image-20220409104612149

3.4 左侧有序号

image-20220409110143771

image-20220409105459424

 private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {
            if (e.Info.IsRowIndicator && e.RowHandle >= 0)
            {
                e.Info.DisplayText = (e.RowHandle + 1).ToString();
            }
        }

image-20220409105817885

image-20220409105930580

3.5 奇偶行不同

image-20220409112652156

3.6 表格表头的操作
  • 这样单击表头就不会有控件默认的右键菜单、排序、筛选

image-20220409113301472

3.7 外观设计总结
           //view.OptionsView.ShowViewCaption = true;    //显示标题
                view.OptionsView.EnableAppearanceEvenRow = true;    //奇偶行颜色
                view.OptionsView.EnableAppearanceOddRow = true;
                view.OptionsView.ShowButtonMode = ShowButtonModeEnum.ShowForFocusedRow; //单元格按钮显示方式
                view.OptionsView.ColumnHeaderAutoHeight = DefaultBoolean.True;  //列头自动换行
                view.OptionsView.ShowGroupPanel = false;
                view.OptionsView.ShowIndicator = true;
           view.BestFitColumns();
            //view.IndicatorWidth = 60;

            view.OptionsCustomization.AllowFilter = false;  //禁用过滤
            view.OptionsCustomization.AllowColumnMoving = false;    //禁止移动列头

            view.OptionsMenu.EnableColumnMenu = false;  //禁用控件自带右键菜单
            view.OptionsMenu.EnableFooterMenu = false;
            view.OptionsMenu.EnableGroupPanelMenu = false;

            //view.OptionsFind.AlwaysVisible = true;
            //view.OptionsFind.ShowClearButton = false;
            //view.OptionsFind.ShowFindButton = false;
            //view.OptionsFind.FindNullPrompt = "输入搜索文本,搜索...";
            
            view.OptionsBehavior.AllowFixedGroups = DefaultBoolean.True;
            view.OptionsBehavior.AllowPixelScrolling = DefaultBoolean.True;

            view.OptionsSelection.CheckBoxSelectorColumnWidth = 30;
            view.OptionsSelection.MultiSelect = true;   //启用复选框
            view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
  • 提示:很多外观的细节设计需要我们耐心地查找相关的属性设置,很多我也不知道。

四 、设置每个单元格的编辑器类型

4.1 将某列设置编辑器类型

image-20220409110855455

image-20220409111105118

  • 为单元格绑定事件
 this.repositoryItemComboBox3.SelectedIndexChanged += new System.EventHandler(this.repositoryItemComboBox3_SelectedIndexChanged);
4.2 对每个单元格设置编辑器类型
  // 自定义每个单元格的 编辑器 类型
        private void gvCementSlurryFormula_CustomRowCellEdit(object sender, CustomRowCellEditEventArgs e)
        {
            DevExpress.XtraEditors.Repository.RepositoryItemComboBox ItemComboBox = new DevExpress.XtraEditors.Repository.RepositoryItemComboBox();// 下拉框
            ItemComboBox.Items.Add("");
            ItemComboBox.Items.Add("浅表层常规密度体系");
            ItemComboBox.Items.Add("深表层常规密度体系");
            ItemComboBox.Items.Add("深表层粉煤灰低密度体系");
            ItemComboBox.Items.Add("JS-2常规密度体系");
            ItemComboBox.Items.Add("永旭常规密度体系");
            ItemComboBox.AppearanceDropDown.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; // 居中
            ItemComboBox.SelectedIndexChanged += ItemComboBox_SelectedIndexChanged; // 绑定事件
            
             DevExpress.XtraEditors.Repository.RepositoryItemMemoEdit ItemMemoEdit = new DevExpress.XtraEditors.Repository.RepositoryItemMemoEdit(); // 文本框
          
if (e.RowHandle==0&&e.Column.Name!="col1") // 第一行
        {
            e.RepositoryItem = ItemComboBox; // 下拉框
        }
        if (e.RowHandle == 1 && e.Column.Name != "col1") // 第一行
        {
            e.RepositoryItem = ItemMemoEdit; // 文本框
        }
    }
  • 对于以上自定义 编辑器控件 的属性和事件,建议多看看 image-20220409115717343类,在该类中可以参考如何为控件属性赋值和定义事件,我们通过界面设置的各种参数,可以在该类中生成对应代码,所以我们也可以在该类中直接编辑代码。

  • 将单元格设置为某编辑器控件之后,该编辑器控件的很多属性和事件都没法通过界面的形式进行设置。我们可以先对该编辑器控件的原本控件进行界面设置。如 repositoryItemComboBox 对应 ComboBox,repositoryItemButtonEdit对应ButtonEdit。我们再到 *.designer.cs 类中去看 控件的事件和属性是怎么设置的,这样我们手动设置单元格中的编辑器控件的事件和属性就容易多了。

  •  //
        this.repositoryItemButtonEdit1.ButtonClick += new DevExpress.XtraEditors.Controls.ButtonPressedEventHandler(this.repositoryItemButtonEdit1ButtonClick);
    // 单击 单元格中控件
     public void repositoryItemButtonEdit1ButtonClick(object sender, ButtonPressedEventArgs e)
            {
        // sender用来获取当前触发事件的控件。
                //获取单元格的值
                ButtonEdit bte = sender as ButtonEdit;
                //根据按钮的位置获取其选择的行
                //显示新界面
                frmDrillingfluidMaterialConsumption frmDrillingfluidMaterialConsumption = new frmDrillingfluidMaterialConsumption(bte.Text, sender);
                frmDrillingfluidMaterialConsumption.Show();
                frmDrillingfluidMaterialConsumption.OnConsumptionToMd += FrmDrillingfluidMaterialConsumption_OnConsumptionToMd;
            }
    

    image-20220409115240550

五 、动态增加列

BandedGridColumn bandedGridColumn = (new BandedGridColumn() { Name = cFieldName, FieldName = cFieldName, Caption = cCaption, VisibleIndex = 0 });
                    bandedGridColumn.ColumnEdit = this.repositoryItemButtonEdit1;//设置该列的编辑器类型
                    Quantity.Columns.Add(bandedGridColumn); //

六、BandedGridView的使用

  • BandedGridView :带区网格视图,以类似于网格视图的二维表格来显示数据,并且把一个或多个列bandedGridColumn组织到带区GridBand内。

  • image-20220409144930951

  • 将 gridColumn列拖动加入到对应的gridBand中

    image-20220409145131637

  • 可通过这是 GridBand的属性,将界面设置为自己想要的样子。比如image-20220409145821900

  • 效果图:

image-20220409150215993

七、分组显示

image-20220409154815184

image-20220409155828991

八、对GridView 增加删除时易出现空行问题的解决

  • 个人遇到的错误:多次对GridView 进行增加和删除后,再通过DataTable dt=(DataTable)this.gridControl1.DataSource;获取表格中的数据时,会出现其中某行数据为空,导致在进行在数据转换为List时会出现错误,这个问题我也不知道怎么解释,我是这样解决的:DataTable dt= dt = ((DataView)gridView1.DataSource).ToTable();

九 、参考文献

下一次,世界精彩处见!

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以使用 WinForms 的 GridControl 控件来实现行内编辑并保存操作。下面是一个简单的示例代码,演示如何在 GridControl 中进行行内编辑并保存数据: ```csharp using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraGrid.Views.Grid; namespace WinFormsApp { public partial class MainForm : Form { private DataTable dataTable; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 创建一个 DataTable 并添加数据 dataTable = new DataTable(); dataTable.Columns.Add("ID", typeof(int)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Rows.Add(1, "John"); dataTable.Rows.Add(2, "Jane"); // 将 DataTable 绑定到 GridControl gridControl.DataSource = dataTable; } private void gridView_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { // 当单元格的值发生改变时,自动保存数据 gridView.PostEditor(); gridView.UpdateCurrentRow(); } private void btnSave_Click(object sender, EventArgs e) { // 保存数据到数据库或其他存储位置 // 这里只输出保存的数据到控制台 foreach (DataRow row in dataTable.Rows) { Console.WriteLine("ID: " + row["ID"] + ", Name: " + row["Name"]); } } } } ``` 在这个示例中,我们使用了一个 GridControl 控件和一个 GridView 控件来展示和编辑数据。在窗体加载时,我们创建了一个 DataTable 对象,并将其绑定到 GridControl。每当单元格的值发生改变时,通过事件处理程序 `gridView_CellValueChanged` 来自动保存数据,这里我们只是简单地将保存的数据输出到控制台。另外,我们还可以添加一个保存按钮,点击按钮时调用保存数据的逻辑,您可以根据实际需求修改保存的方式。 希望这个示例能帮助到您实现行内编辑并保存数据的功能。如果有任何问题,请随时问我。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值