tangxu
2024-11-04 ebd031e3bed6c1cfddce8fc9b98f7f9e95fb9e32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System.Diagnostics.Eventing.Reader;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
 
namespace DPumpHydr.WinFrmUI.WenSkin.Controls
{
    public class WenTreeDataGridViewTextBoxCell : DataGridViewTextBoxCell
    {
        private TreeDataGridViewCellValues Values { get; set; } 
        protected override void Paint(Graphics g, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            base.Paint(g, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
 
            if (value is TreeDataGridViewCellValues treeData)
            {
                int indent = treeData.Indent * treeData.Level + 3;
 
                RectangleF rec = new RectangleF(cellBounds.X, cellBounds.Y + 1, cellBounds.Width - 1, cellBounds.Height - 2);
 
 
                ControlHelper.SetGDIHigh(g);
 
                RectangleF recStr = new RectangleF(rec.X + 16 + indent, rec.Y, rec.Width, rec.Height);
 
                if ((cellState | DataGridViewElementStates.Selected) == cellState)
                {
                    g.FillRectangle(new SolidBrush(cellStyle.SelectionBackColor), rec);
                    g.DrawString(treeData.Text, cellStyle.Font, new SolidBrush(cellStyle.SelectionForeColor), recStr, ControlHelper.StringConters);
                }
                else
                {
                    g.FillRectangle(new SolidBrush(cellStyle.BackColor), rec);
                    g.DrawString(treeData.Text, cellStyle.Font, new SolidBrush(cellStyle.ForeColor), recStr, ControlHelper.StringConters);
                }
 
                #region 其他方法
 
 
                //按钮区域
                //Rectangle recButton = new Rectangle((int)rec.X + indent, (int)rec.Y + (int)(rec.Height - 12) / 2, 12, 12);
 
                //用gdi绘制
 
                //g.DrawRectangle(Pens.Gray, recButton);
 
                ////绘制横线一条  -
 
                //g.DrawLine(Pens.Black, recButton.X+1, recButton.Y + 6, recButton.X + 10, recButton.Y + 6);
 
                //if (treeData.CellState)
                //    g.DrawLine(Pens.Black, recButton.X + 6, recButton.Y+1, recButton.X + 6, recButton.Y + 10);
 
                ////画虚线
                //using (Pen p=new Pen(Color.Gray) {DashStyle=System.Drawing.Drawing2D.DashStyle.Dot })
                //{
                //    Rectangle xian=DataGridView.Rows[rowIndex].Cells[]
                //    g.DrawLine(p,)
                //}
 
                #endregion
 
                // 采用图片绘制
                Image image = WenSkin.Properties.Resources.sanjiaoxing;
                image.RotateFlip(RotateFlipType.Rotate180FlipNone);
                if (treeData.CellState)
                    image.RotateFlip(RotateFlipType.Rotate270FlipNone);
 
 
                g.DrawImage(image, rec.X + indent, rec.Y + (rec.Height - 16) / 2, 16, 16);
            }
        }
 
        protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
        {
            base.OnMouseClick(e);
 
            Rectangle cellRec = this.ContentBounds;
 
            if (this.Value is TreeDataGridViewCellValues treeData)
            {
                Rectangle rec = new Rectangle(treeData.Level * treeData.Indent
                    , (cellRec.Height - 16) / 2, 16, 16);
                if (rec.Contains(e.Location))
                {
                    if (!treeData.CellState)
                    {
                        CloseSubNode(treeData.Nodes, e.ColumnIndex);
                        treeData.CellState = true;
                    }
                    else
                    {
                        foreach (TreeDataGridViewRowNode item in treeData.Nodes)
                        {
                            item.DataGridViewRow.Visible = true;
                        }
                        treeData.CellState = false;
                    }
                }
            }
        }
        private void CloseSubNode(TreeDataGridViewRowNodeCollection nodes, int columnIndex)
        {
            foreach (TreeDataGridViewRowNode item in nodes)
            {
                item.DataGridViewRow.Visible = false;
                if (item.DataGridViewRow.Cells[columnIndex].Value is TreeDataGridViewCellValues values)
                {
                    values.CellState = true;
                }
                if (item.Nodes.Count > 0)
                    CloseSubNode(item.Nodes, columnIndex);
            }
        }
 
        //值变化
        protected override bool SetValue(int rowIndex, object value)
        {
            if (value is TreeDataGridViewCellValues treeData)
            {
                Values = treeData;
                return base.SetValue(rowIndex, value);
            }
            else if (Values is TreeDataGridViewCellValues v)
            {
                v.Text = value?.ToString();
                return base.SetValue(rowIndex, this.Values);
            }
            return base.SetValue(rowIndex, value);
        }
    }
}