你的位置:首页 > ASP.net教程

[ASP.net教程]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_Cells101 {102   public partial class SourceTextBox : UserControl103   {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, IDataGridViewEditingControl132   {133     DataGridView dataGridView;134     private bool valueChanged = false;135     int rowIndex;136 137     public ScriptTextEditingControl()138     {139       //文本变更更新到cell140       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 cell146       // 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 EditingControlFormattedValue156     {157       get158       {159         return this.textBox1.Text;160       }161       set162       {163         if (value is String)164         {165           try166           {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           catch172           {173             // In the case of an exception, just use the 174             // default value so we're not left with a null175             // 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 EditingControlRowIndex203     {204       get205       {206         return rowIndex;207       }208       set209       {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 IDataGridViewEditingControl244     // .RepositionEditingControlOnValueChange property.245     public bool RepositionEditingControlOnValueChange246     {247       get248       {249         return false;250       }251     }252 253     // Implements the IDataGridViewEditingControl254     // .EditingControlDataGridView property.255     public DataGridView EditingControlDataGridView256     {257       get258       {259         return dataGridView;260       }261       set262       {263         dataGridView = value;264       }265     }266 267     // Implements the IDataGridViewEditingControl268     // .EditingControlValueChanged property.269     public bool EditingControlValueChanged270     {271       get272       {273         return valueChanged;274       }275       set276       {277         valueChanged = value;278       }279     }280 281     // Implements the IDataGridViewEditingControl282     // .EditingPanelCursor property.283     public Cursor EditingPanelCursor284     {285       get286       {287         return base.Cursor;288       }289     }290 291     protected override void OnTextChanged(EventArgs e)292     {293       // Notify the DataGridView that the contents of the cell294       // 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_Cells11 {12   public partial class SourceTextBox : UserControl13   {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       // textBox136       // 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       // btnSource46       // 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       // SourceTextBox65       // 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     #endregion79 80     public System.Windows.Forms.Button btnSource;81     public System.Windows.Forms.TextBox textBox1;82   }83 }

View Code

3 效果