关于TreeGridView使用和CellPainting对内容重绘

1 篇文章 0 订阅

TreeGridView的使用

相关dll引用

初始是要修改界面上的显示问题。由于接手别人的代码,不知道这个控件是什么以及用法什么,我先在toolbox里找没找到。后面通过设计界面找到类型( AdvancedDataGridView),然后就找不到上一级了,只能通过引用dll,找类似的看内部函数。

  • 具体dll,右键——view in object browser,单机每个dll都能看到里面具体函数,我把所有datagridview和treelist相关的dll都查了,最终找到了引用的dll(ExpandableGridView.dll)。

控件添加

  • 我以为添加了dll总能直接从toolbox里拖出个控件了呢,太天真。。。里面还是没有。实际上还是Datagridview 控件放到窗体中,然后修改设计器里(designer.cs)的代码 this.dataGridView1 = new AdvancedDataGridView.TreeGridView();将原本的Datagridview类型修改成我们要的TreeGridView类型。
  • 根据业务内容,添加4列,如图:第一列是图片列,可以添加imagelist;第二列(实际上应该叫第一列),必须选择类型为TreeGridColumn,否则没有办法添加节点(比如说这列类型textbox,下列选TreeGrid就不行)
    在这里插入图片描述

节点添加

这个控件的列是分离的,第一列设定了是节点列,所以父子关系会在这列显示,其他的列数据可以看情况添加。

  TreeGridNode node = dataGridView1.Nodes.Add(null,"1","父节点","第一行","第五列");
  TreeGridNode node1 =node.Nodes.Add (null,"2","子节点");

在这里插入图片描述
添加模式就是从第一列往后放,没有就不填,超出列的话就添加不上了(也不会报错,直接就是空的)。

行号添加

由于第一列不能放textbox列,所以只能用headercell。需要设置ColumnHeaderVisible属性,然后调用RowStateChanged事件

private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
        {
            e.Row.HeaderCell.Value = (e.Row.Index + 1).ToString();
        }
      

cellpainting

我老大跟我说让我看看把关键字搞成红的,不然不好认,我还反驳他说同一个cell得一起变,打脸。。。我已经道过歉了。找到了这个方法,可以重绘cell的内容,通过坐标来区分。

  e.Graphics.DrawString();
  public void DrawString(string s, Font font, Brush brush, float x, float y);

主要是这个函数,我通过字符串处理分成了两段,用不同的字体和颜色进行重绘,重要的是格式大小,经过查找资料和测试,发现需要将像素大小和字体的size以及坐标进行处理,否则重绘过后会和原来的差别很大。

 private void SeqStepTreeGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.Value != null && e.RowIndex >= 0 && e.ColumnIndex == 2)
            {
                String AllDesString = e.Value.ToString();

                if (AllDesString.Contains("跳转到"))
                {
                    int stringIndex = AllDesString.IndexOf("跳转到");
                    String strP = AllDesString.Substring(0, stringIndex);// 原本字符串
                    String strL = AllDesString.Substring(stringIndex );// 跳转字符串
                    
                    float fontSize = e.CellStyle.Font.Size ;                   
                    float Px = e.CellBounds.X ;                   
                    float Py = e.CellBounds.Y + (e.CellBounds.Height - fontSize) / 2 * 72 / 96; // 字体大小和像素比例
                    float Lx = e.CellBounds.X + strP.Length * (fontSize);
                    float Ly = Py;
                   
                    using (Brush foreColor = new SolidBrush(e.CellStyle.ForeColor), fontColor = new SolidBrush(Color.Red))
                    {
                        //绘制背景色
                        e.PaintBackground(e.ClipBounds, false);
                        //绘制背景色(被选中状态下)
                        if (e.State == (DataGridViewElementStates.Displayed | DataGridViewElementStates.Selected | DataGridViewElementStates.Visible))
                            e.PaintBackground(e.ClipBounds, true);
                        //分别绘制不用改变的文本和改变颜色的文本
                        e.Graphics.DrawString(strP, e.CellStyle.Font, foreColor,Px ,Py , StringFormat.GenericDefault);
                        e.Graphics.DrawString(strL, e.CellStyle.Font, fontColor,Lx,Ly , StringFormat.GenericDefault);
                        //提交事务
                        e.Handled = true;
                    }


                }
            
            }
           

        }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值