zoukankan      html  css  js  c++  java
  • c# 表格控件SourceGrid使用总结

    网上SourceGrid相关的资料很少,使用过程中做了下记录,以便日后查用

    1:初始化

    this.grid = new SourceGrid.Grid();
    this.grid.Size = new System.Drawing.Size(552, 224);
    this.grid.Location = new System.Drawing.Point(0, 0);
    this.tabPage1.Controls.Add(this.grid);

    2:设置行列

    方法1: grid.Redim(20,12);
    方法2: grid.ColumnsCount = 3;
           grid.RowsCount = 3;
    方法3: 在属性中设置 ColumnsCount和RowsCount的值
    
    grid.Rows.Insert(3);

    3:固定行列

    grid.FixedRows = 2;
    grid.FixedColumns = 3;

    4:标题列赋值及标题样式(标题是否自带排序)

     grid[0, 0] = new SourceGrid.Cells.ColumnHeader("序号");
     grid[0, 1] = new SourceGrid.Cells.ColumnHeader("区块名称");
    
    对标题样式进行修改
    grid1[0, 0] = new MyHeader("序号");
    
     private class MyHeader : SourceGrid.Cells.ColumnHeader
      {
          public MyHeader(object value) : base(value)
            {
              //1 Header Row
              SourceGrid.Cells.Views.ColumnHeader view = new SourceGrid.Cells.Views.ColumnHeader();
              view.Font = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
              view.TextAlignment = DevAge.Drawing.ContentAlignment.MiddleCenter;
              View = view;
          //自带排序true;不实现排序false AutomaticSortEnabled
    = false; } }

    5:内容列赋值

     字符串类型: grid[1, 3] = new SourceGrid.Cells.Cell("Hello " + r.ToString(), typeof(string));
     复选框类型: grid[1, 5] = new SourceGrid.Cells.CheckBox(null, true);
     按钮类型:   grid[62, 2] = new SourceGrid.Cells.Button("删除");
     时间类型:   grid[1, 4] = new SourceGrid.Cells.Cell(DateTime.Today, typeof(DateTime));
            grid[1, 2] = new SourceGrid.Cells.Cell(12121);
    
     获取:var aa=grid[1, 4].Value.ToString();
     重新赋值: grid[r + i, 4].Value = "2";  
    
    注意:单元格格式用上面形式,赋值用Value可以避免多次赋值无效的问题  

    6:单元格宽高设置

    单元格根据内容自动变化:
    (不包含标题列,只对内容有效,我感觉不好用,还是根据自己需求设置宽度)
     grid.AutoSizeCells();
    
     grid.Columns[0].Width = 100;(要在AutoSizeCells()方法后使用,否则无效)
     grid.Rows[0].Height = 30;

    7:删除某行某列

    grid.Rows.Remove(3);//删除下标为3的行
    grid.Columns.Remove(3);

    8:设置单元格文本/图片居中及背景色(斑马线即隔行换色)

    /// <summary>
    /// 设置表头字体及样式
    /// </summary>
    public class MyHeader : SourceGrid.Cells.ColumnHeader
    {
      public MyHeader(object value) : base(value)
      {
      //1 Header Row
      SourceGrid.Cells.Views.ColumnHeader view = new SourceGrid.Cells.Views.ColumnHeader();
      view.Font = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold);
      view.TextAlignment = DevAge.Drawing.ContentAlignment.MiddleCenter;
      View = view;

      AutomaticSortEnabled = false;
      }
    }

    //使用grid[0, 0] = new MyHeader("序号");

     
    SourceGrid.Cells.Views.Cell transparentView = new SourceGrid.Cells.Views.Cell(); transparentView.BackColor = Color.White;
     //字体
    //transparentView.Font = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold); transparentView.TextAlignment
    = DevAge.Drawing.ContentAlignment.MiddleCenter; transparentView.ImageAlignment = DevAge.Drawing.ContentAlignment.MiddleCenter; SourceGrid.Cells.Views.Cell semiTransparentView = new SourceGrid.Cells.Views.Cell(); semiTransparentView.BackColor = Color.LightCyan; semiTransparentView.TextAlignment = DevAge.Drawing.ContentAlignment.MiddleCenter; semiTransparentView.ImageAlignment = DevAge.Drawing.ContentAlignment.MiddleCenter;
    CheckBoxBackColorAlternate viewCheckBox = new CheckBoxBackColorAlternate(Color.LightCyan, Color.White);

      隔行显示

      for (int r = 1; r < grid.RowsCount; r++)
      {
       for (int j = 0; j < grid.ColumnsCount; j++)
       {
        if ((r - 1) % 2 == 0) grid[r, j].View = transparentView;
        else grid[r, j].View = semiTransparentView;
       }
      }

    9:按钮button的相关设置

    SourceGrid.Cells.Views.Cell buttonView = new SourceGrid.Cells.Views.Button();
    buttonView.TextAlignment = DevAge.Drawing.ContentAlignment.MiddleCenter;
    buttonView.Padding = new DevAge.Drawing.Padding(2, 30, 2, 5);
    使用:
    grid[1, 20] = new SourceGrid.Cells.Button("删除");

    grid[1,20].View=buttonView;

    10:复选框checkBox的相关设置

            //使用:
            grid[r, 16] = new SourceGrid.Cells.CheckBox(null, true);
         CheckBoxBackColorAlternate viewCheckBox = new CheckBoxBackColorAlternate(Color.LightCyan, Color.White); grid[
    1, 3].View = viewCheckBox; /// <summary> /// 复选框CheckBox的相关设置 /// </summary> public class CheckBoxBackColorAlternate : SourceGrid.Cells.Views.CheckBox { public CheckBoxBackColorAlternate(Color firstColor, Color secondColor) { FirstBackground = new DevAge.Drawing.VisualElements.BackgroundSolid(firstColor); SecondBackground = new DevAge.Drawing.VisualElements.BackgroundSolid(secondColor); } private DevAge.Drawing.VisualElements.IVisualElement mFirstBackground; public DevAge.Drawing.VisualElements.IVisualElement FirstBackground { get { return mFirstBackground; } set { mFirstBackground = value; } } private DevAge.Drawing.VisualElements.IVisualElement mSecondBackground; public DevAge.Drawing.VisualElements.IVisualElement SecondBackground { get { return mSecondBackground; } set { mSecondBackground = value; } } protected override void PrepareView(SourceGrid.CellContext context) { base.PrepareView(context); if (Math.IEEERemainder(context.Position.Row, 2) == 0) Background = FirstBackground; else Background = SecondBackground; } }

    注意:SourceGrid中不知道为什么没有单选按钮Radio,我为了实现效果直接用了CheckBox复选框,在单元格的点击事件中实现单选效果

     private void clickEvent_Click(object sender, EventArgs e)
            {
                SourceGrid.CellContext context = (SourceGrid.CellContext)sender;
                if (context.Position.Column == 1)//选择事件
                {
                    for (int r = 1; r < grid.RowsCount; r++)
                    {
                        if (r == context.Position.Row)
                        {
                            grid[r, 1].Value = true;
                        }
                        else
                        {
                            grid[r, 1].Value = false;
                        }
                    }
                }
            }

    11:复制粘贴

    1.grid.ClipboardMode = SourceGrid.ClipboardMode.All;
    2.也可在属性中设置
    若要实现单元格不可编辑但是可以复制功能的话需要注意:(不能使用14中的单元格不可操作代码)
    上述设置实现后,在赋值地方
    grid[1, 3] = new SourceGrid.Cells.Cell("Hello " + r.ToString(), typeof(string));改为
    grid[1, 3] = new SourceGrid.Cells.Cell("Hello " + r.ToString());即不要带赋值类型就可实现不可编辑

    12:单元格添加事件(点击事件/修改编辑后触发的事件)(点击/鼠标进入单元格显示手型,离开现实默认样式)

    SourceGrid.Cells.Controllers.CustomEvents clickEvent = new SourceGrid.Cells.Controllers.CustomEvents();
    clickEvent.Click += new EventHandler(clickEvent_Click);//点击(单击)
    clickEvent.DoubleClick += new EventHandler(clickEvent_DoubleClick);//双击
    clickEvent.EditEnded += new EventHandler(editEvent_EditEnded);//编辑后
    //鼠标进入和离开 clickEvent.MouseEnter += new EventHandler(mouseEvent_MouseEnter); clickEvent.MouseLeave += new EventHandler(mouseEvent_MouseLeave); //绑定事件 grid[r, 8].AddController(clickEvent); //单击事件 private void clickEvent_Click(object sender, EventArgs e) { SourceGrid.CellContext context = (SourceGrid.CellContext)sender; MessageBox.Show(this, context.Position.ToString()); }
    //双击事件
    private void clickEvent_DoubleClick(object sender, EventArgs e)

      {
        SourceGrid.CellContext context = (SourceGrid.CellContext)sender;
        MessageBox.Show(this, context.Position.ToString());
        //要执行的操作

      }

    /// <summary>
    /// 进入单元格鼠标显示手型
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void mouseEvent_MouseEnter(object sender, EventArgs e)
    {
      SourceGrid.CellContext context = (SourceGrid.CellContext)sender;
      if (context.Position.Column == 8)
      {
        this.Cursor = Cursors.Hand;
      }
    }
    /// <summary>
    /// 离开单元格鼠标显示默认状态
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void mouseEvent_MouseLeave(object sender, EventArgs e)
    {
      SourceGrid.CellContext context = (SourceGrid.CellContext)sender;
      if (context.Position.Column == 8)
      {
        this.Cursor = Cursors.Default;
      }
    }
            /// <summary>
            /// 单元格编辑结束
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void editEvent_EditEnded(object sender, EventArgs e)
            {
                SourceGrid.CellContext context = (SourceGrid.CellContext)sender;
                //进行保存等相关操作
            }    

    13:隐藏/显示行/列

    grid1.Columns[0].Visible=true;
    grid1.Rows[1].Visible = false;

    14:使单元格不可操作(不可编辑)

    grid[1, 2].AddController(SourceGrid.Cells.Controllers.Unselectable.Default);

    15:ComboBox下拉框的使用

    SourceGrid.Cells.Editors.ComboBox cbKFJD = new SourceGrid.Cells.Editors.ComboBox(typeof(string));
    cbKFJD.StandardValues = new string[] { "老区","新区" };
    cbKFJD.EditableMode = SourceGrid.EditableMode.Focus | SourceGrid.EditableMode.SingleClick | SourceGrid.EditableMode.AnyKey;
    grid[1, 2] = new SourceGrid.Cells.Cell("老区", cbKFJD);

    16:报错索引超出界限的特殊性情况处理:

    在代码中设置了足够的行数和列数但是在colspan或rowspan的时候依然报错可能原因是在属性设置中Columnscout或Rowscount设置了值但是值不够大,

    解决办法:1.属性设置Columnscout和Rowscount不要设值默认值0(推荐)

        2.属性设置Columnscout或Rowscount设置一个足够大的值就行

    17:进入页面不显示焦点:grid.Selection.FocusStyle = FocusStyle.None;

    18:以Excel格式导出当前SourceGrid表格

         /// <summary>
            /// 导出计算报表
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void materialButton2_Click(object sender, EventArgs e)
            {
                try
                {
                    SaveFileDialog sfd = new SaveFileDialog();
                    string tradeTime = DateTime.Now.ToString("yyyyMMddHHmmss", DateTimeFormatInfo.InvariantInfo);
                    sfd.FileName = "计算报表" + tradeTime;
                    if (sfd.ShowDialog() != DialogResult.OK) return;
                    //保存
                    var exportFileName = System.IO.Path.Combine(sfd.FileName.Substring(0, sfd.FileName.Length - 18), sfd.FileName.Substring(sfd.FileName.Length - 18) + ".csv");
    
                    using (var writer = new System.IO.StreamWriter(exportFileName, false, System.Text.Encoding.Default))
                    {
                        var csv = new SourceGrid.Exporter.CsvExporter();
                        csv.Export(grid, writer);
                        writer.Close();
                        MessageBox.Show("导出成功!");
                    }
    
                    DevAge.Shell.Utilities.OpenFile(exportFileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("导出失败!" + ex.Message);
                }
  • 相关阅读:
    在 Windows 上测试 Redis Cluster的集群填坑笔记
    vmware安装黑苹果教程
    微信支付v3发布到iis时的证书问题
    Linux下安装SQL Server 2016(连接篇SQL Server on linux)
    Linux下安装SQL Server 2016(连接篇SQL Server on linux)
    Linux下安装SQL Server 2016(安装篇SQL Server on linux)
    Linux下安装SQL Server 2016(准备篇SQL Server on linux)
    客服端与服务端APP支付宝支付接口联调的那些坑
    ASP.NET MVC]WebAPI应用支持HTTPS的经验总结
    .net平台下C#socket通信(中)
  • 原文地址:https://www.cnblogs.com/zhoushuang0426/p/10868268.html
Copyright © 2011-2022 走看看