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 效果

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM