Fork me on GitHub

C#如何在DataGridViewCell中自定义脚本编辑器

    上一篇博文探讨了如何自定义DataGridViewColumn实现一个TreeViewColumn来在DataGridView控件中显示TreeView控件,其实我们还可以继续发挥想象,自定义其他的列类型,下面介绍一个脚本编辑器列类型,我这里取名ScriptTextEditorColumn,当用户单击DataGridView的ScriptTextEditorColumn时,单元格右边会出现一个按钮,单击按钮会弹出一个脚本编辑器窗体,用户可以在窗体中进行代码维护,然后回写到单元格中。

  用人会问,这个控件有啥实际作用,其实结合动态编译的技术,在datagridview中进行取值公式的模板设定,也就是在对应的单元格中设置C#脚本,然后动态执行后呈现结果到一个datagridview单元格中,这样就实现了动态配置datagridview后台计算逻辑的目的,当然实现这样的功能还需要大量的工作,但是主要的思路就是这样。

1 ScriptTextEditorColumn

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Windows.Forms;
  6 
  7 namespace Host_Controls_in_Windows_Forms_DataGridView_Cells
  8 {
  9    public class ScriptTextEditorColumn : DataGridViewColumn
 10     {
 11        public ScriptTextEditorColumn()
 12            : base(new ScriptTextEditorCell())
 13         {
 14         }
 15 
 16         public override DataGridViewCell CellTemplate
 17         {
 18             get
 19             {
 20                 return base.CellTemplate;
 21             }
 22             set
 23             {
 24                 // Ensure that the cell used for the template is a ScriptTextEditorCell.
 25                 if (value != null &&
 26                     !value.GetType().IsAssignableFrom(typeof(ScriptTextEditorCell)))
 27                 {
 28                     throw new InvalidCastException("Must be a ScriptTextEditorCell");
 29                 }
 30                 base.CellTemplate = value;
 31             }
 32         }
 33     }
 34 
 35     //----------------------------------------------------------------------
 36     public class  ScriptTextEditorCell : DataGridViewTextBoxCell
 37     {
 38 
 39         public ScriptTextEditorCell()
 40             : base()
 41         {
 42            
 43         }
 44 
 45         public override void InitializeEditingControl(int rowIndex, object
 46             initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
 47         {
 48             // Set the value of the editing control to the current cell value.
 49             base.InitializeEditingControl(rowIndex, initialFormattedValue,
 50                 dataGridViewCellStyle);
 51             ScriptTextEditingControl ctl =
 52                 DataGridView.EditingControl as ScriptTextEditingControl;
 53             // Use the default row value when Value property is null.
 54             if (this.Value == null)
 55             {
 56                 ctl.textBox1.Text = (String)this.DefaultNewRowValue;
 57             }
 58             else
 59             {
 60                 ctl.textBox1.Text = (String)this.Value;
 61             }
 62         }
 63 
 64         public override Type EditType
 65         {
 66             get
 67             {
 68                 // Return the type of the editing control that CalendarCell uses.
 69                 return typeof(ScriptTextEditingControl);
 70             }
 71         }
 72 
 73         public override Type ValueType
 74         {
 75             get
 76             {
 77                 // Return the type of the value that CalendarCell contains.
 78 
 79                 return typeof(String);
 80             }
 81         }
 82 
 83         public override object DefaultNewRowValue
 84         {
 85             get
 86             {
 87                 // Use the current date and time as the default value.
 88                 string code = @"
 89 #region
 90 //jackwangcumt
 91 #endregion
 92 using System;
 93 using System.Collections.Generic;
 94 using System.ComponentModel;
 95 using System.Drawing;
 96 using System.Data;
 97 using System.Linq;
 98 using System.Text;
 99 using System.Windows.Forms;
100 namespace Host_Controls_in_Windows_Forms_DataGridView_Cells
101 {
102     public partial class SourceTextBox : UserControl
103     {
104         public SourceTextBox()
105         {
106             InitializeComponent();
107             this.textBox1.Location = this.Location;
108             this.textBox1.Width = this.Width;
109             this.textBox1.Height = this.Height;
110         }
111         protected void OnValueChanged(string text)
112         {
113             this.textBox1.Text = text;
114         }
115 
116         private void btnSource_Click(object sender, EventArgs e)
117         {
118             ScriptEditor frm = new ScriptEditor(this.textBox1.Text);
119             frm.ShowDialog();
120             this.textBox1.Text = frm.fastColoredTextBox1.Text;
121         }
122     }
123 }
124                 ";
125                 return code;
126             }
127         }
128     }
129     //-----------------------------------------------------------------
130 
131     class ScriptTextEditingControl : SourceTextBox, IDataGridViewEditingControl
132     {
133         DataGridView dataGridView;
134         private bool valueChanged = false;
135         int rowIndex;
136 
137         public ScriptTextEditingControl()
138         {
139             //文本变更更新到cell
140             this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
141         }
142 
143         void textBox1_TextChanged(object sender, EventArgs e)
144         {
145             // Notify the DataGridView that the contents of the cell
146             // have changed.
147             valueChanged = true;
148             this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
149             //调用SourceTextBox的OnValueChanged(string Text)
150             base.OnValueChanged(this.textBox1.Text);
151         }
152 
153         // Implements the IDataGridViewEditingControl.EditingControlFormattedValue 
154         // property.
155         public object EditingControlFormattedValue
156         {
157             get
158             {
159                 return this.textBox1.Text;
160             }
161             set
162             {
163                 if (value is String)
164                 {
165                     try
166                     {
167                         // This will throw an exception of the string is 
168                         // null, empty, or not in the format of a date.
169                        this.textBox1.Text=((String)value);
170                     }
171                     catch
172                     {
173                         // In the case of an exception, just use the 
174                         // default value so we're not left with a null
175                         // value.
176                         this.textBox1.Text = "jackwangcumt>>error";
177                     }
178                 }
179             }
180         }
181 
182         // Implements the 
183         // IDataGridViewEditingControl.GetEditingControlFormattedValue method.
184         public object GetEditingControlFormattedValue(
185             DataGridViewDataErrorContexts context)
186         {
187             return EditingControlFormattedValue;
188         }
189 
190         // Implements the 
191         // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
192         public void ApplyCellStyleToEditingControl(
193             DataGridViewCellStyle dataGridViewCellStyle)
194         {
195             this.Font = dataGridViewCellStyle.Font;
196             //this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
197             //this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
198         }
199 
200         // Implements the IDataGridViewEditingControl.EditingControlRowIndex 
201         // property.
202         public int EditingControlRowIndex
203         {
204             get
205             {
206                 return rowIndex;
207             }
208             set
209             {
210                 rowIndex = value;
211             }
212         }
213 
214         // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey 
215         // method.
216         public bool EditingControlWantsInputKey(
217             Keys key, bool dataGridViewWantsInputKey)
218         {
219             // Let the DateTimePicker handle the keys listed.
220             switch (key & Keys.KeyCode)
221             {
222                 case Keys.Left:
223                 case Keys.Up:
224                 case Keys.Down:
225                 case Keys.Right:
226                 case Keys.Home:
227                 case Keys.End:
228                 case Keys.PageDown:
229                 case Keys.PageUp:
230                     return true;
231                 default:
232                     return !dataGridViewWantsInputKey;
233             }
234         }
235 
236         // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit 
237         // method.
238         public void PrepareEditingControlForEdit(bool selectAll)
239         {
240             // No preparation needs to be done.
241         }
242 
243         // Implements the IDataGridViewEditingControl
244         // .RepositionEditingControlOnValueChange property.
245         public bool RepositionEditingControlOnValueChange
246         {
247             get
248             {
249                 return false;
250             }
251         }
252 
253         // Implements the IDataGridViewEditingControl
254         // .EditingControlDataGridView property.
255         public DataGridView EditingControlDataGridView
256         {
257             get
258             {
259                 return dataGridView;
260             }
261             set
262             {
263                 dataGridView = value;
264             }
265         }
266 
267         // Implements the IDataGridViewEditingControl
268         // .EditingControlValueChanged property.
269         public bool EditingControlValueChanged
270         {
271             get
272             {
273                 return valueChanged;
274             }
275             set
276             {
277                 valueChanged = value;
278             }
279         }
280 
281         // Implements the IDataGridViewEditingControl
282         // .EditingPanelCursor property.
283         public Cursor EditingPanelCursor
284         {
285             get
286             {
287                 return base.Cursor;
288             }
289         }
290 
291         protected override void OnTextChanged(EventArgs e)
292         {
293             // Notify the DataGridView that the contents of the cell
294             // have changed.
295             valueChanged = true;
296             this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
297             base.OnTextChanged(e);
298           
299         }
300    
301     }
302 
303 
304 
305 }

2 SourceTextBox

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Drawing;
 5 using System.Data;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Windows.Forms;
 9 
10 namespace Host_Controls_in_Windows_Forms_DataGridView_Cells
11 {
12     public partial class SourceTextBox : UserControl
13     {
14         public SourceTextBox()
15         {
16             InitializeComponent();
17             this.textBox1.Location = this.Location;
18             this.textBox1.Width = this.Width;
19             this.textBox1.Height = this.Height;
20         }
21         protected void OnValueChanged(string text)
22         {
23             this.textBox1.Text = text;
24         }
25 
26         private void btnSource_Click(object sender, EventArgs e)
27         {
28             ScriptEditor frm = new ScriptEditor(this.textBox1.Text);
29             frm.ShowDialog();
30             this.textBox1.Text = frm.fastColoredTextBox1.Text;
31         }
32     }
33 }
 1 namespace Host_Controls_in_Windows_Forms_DataGridView_Cells
 2 {
 3     partial class SourceTextBox
 4     {
 5         /// <summary> 
 6         /// 必需的设计器变量。
 7         /// </summary>
 8         private System.ComponentModel.IContainer components = null;
 9 
10         /// <summary> 
11         /// 清理所有正在使用的资源。
12         /// </summary>
13         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
14         protected override void Dispose(bool disposing)
15         {
16             if (disposing && (components != null))
17             {
18                 components.Dispose();
19             }
20             base.Dispose(disposing);
21         }
22 
23         #region 组件设计器生成的代码
24 
25         /// <summary> 
26         /// 设计器支持所需的方法 - 不要
27         /// 使用代码编辑器修改此方法的内容。
28         /// </summary>
29         private void InitializeComponent()
30         {
31             this.textBox1 = new System.Windows.Forms.TextBox();
32             this.btnSource = new System.Windows.Forms.Button();
33             this.SuspendLayout();
34             // 
35             // textBox1
36             // 
37             this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None;
38             this.textBox1.Location = new System.Drawing.Point(3, 3);
39             this.textBox1.Margin = new System.Windows.Forms.Padding(4);
40             this.textBox1.Multiline = true;
41             this.textBox1.Name = "textBox1";
42             this.textBox1.Size = new System.Drawing.Size(175, 21);
43             this.textBox1.TabIndex = 1;
44             // 
45             // btnSource
46             // 
47             this.btnSource.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
48                         | System.Windows.Forms.AnchorStyles.Right)));
49             this.btnSource.BackColor = System.Drawing.Color.Transparent;
50             this.btnSource.BackgroundImage = global::Host_Controls_in_Windows_Forms_DataGridView_Cells.Resource.setting;
51             this.btnSource.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
52             this.btnSource.FlatAppearance.BorderColor = System.Drawing.Color.White;
53             this.btnSource.FlatAppearance.BorderSize = 0;
54             this.btnSource.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
55             this.btnSource.Font = new System.Drawing.Font("新宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
56             this.btnSource.Location = new System.Drawing.Point(159, -1);
57             this.btnSource.Margin = new System.Windows.Forms.Padding(0);
58             this.btnSource.Name = "btnSource";
59             this.btnSource.Size = new System.Drawing.Size(19, 25);
60             this.btnSource.TabIndex = 0;
61             this.btnSource.UseVisualStyleBackColor = false;
62             this.btnSource.Click += new System.EventHandler(this.btnSource_Click);
63             // 
64             // SourceTextBox
65             // 
66             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
67             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
68             this.Controls.Add(this.btnSource);
69             this.Controls.Add(this.textBox1);
70             this.Margin = new System.Windows.Forms.Padding(0);
71             this.Name = "SourceTextBox";
72             this.Size = new System.Drawing.Size(178, 26);
73             this.ResumeLayout(false);
74             this.PerformLayout();
75 
76         }
77 
78         #endregion
79 
80         public System.Windows.Forms.Button btnSource;
81         public System.Windows.Forms.TextBox textBox1;
82     }
83 }
View Code

3 效果

 

posted @ 2015-12-11 06:33  JackWang-CUMT  阅读(2859)  评论(1编辑  收藏  举报