C#如何在DataGridViewCell中自定义脚本编辑器
2015-12-11 06:33
609 查看
上一篇博文探讨了如何自定义DataGridViewColumn实现一个TreeViewColumn来在DataGridView控件中显示TreeView控件,其实我们还可以继续发挥想象,自定义其他的列类型,下面介绍一个脚本编辑器列类型,我这里取名ScriptTextEditorColumn,当用户单击DataGridView的ScriptTextEditorColumn时,单元格右边会出现一个按钮,单击按钮会弹出一个脚本编辑器窗体,用户可以在窗体中进行代码维护,然后回写到单元格中。
用人会问,这个控件有啥实际作用,其实结合动态编译的技术,在datagridview中进行取值公式的模板设定,也就是在对应的单元格中设置C#脚本,然后动态执行后呈现结果到一个datagridview单元格中,这样就实现了动态配置datagridview后台计算逻辑的目的,当然实现这样的功能还需要大量的工作,但是主要的思路就是这样。
View Code
用人会问,这个控件有啥实际作用,其实结合动态编译的技术,在datagridview中进行取值公式的模板设定,也就是在对应的单元格中设置C#脚本,然后动态执行后呈现结果到一个datagridview单元格中,这样就实现了动态配置datagridview后台计算逻辑的目的,当然实现这样的功能还需要大量的工作,但是主要的思路就是这样。
1 ScriptTextEditorColumn
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace Host_Controls_in_Windows_Forms_DataGridView_Cells { public class ScriptTextEditorColumn : DataGridViewColumn { public ScriptTextEditorColumn() : base(new ScriptTextEditorCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a ScriptTextEditorCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(ScriptTextEditorCell))) { throw new InvalidCastException("Must be a ScriptTextEditorCell"); } base.CellTemplate = value; } } } //---------------------------------------------------------------------- public class ScriptTextEditorCell : DataGridViewTextBoxCell { public ScriptTextEditorCell() : base() { } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); ScriptTextEditingControl ctl = DataGridView.EditingControl as ScriptTextEditingControl; // Use the default row value when Value property is null. if (this.Value == null) { ctl.textBox1.Text = (String)this.DefaultNewRowValue; } else { ctl.textBox1.Text = (String)this.Value; } } public override Type EditType { get { // Return the type of the editing control that CalendarCell uses. return typeof(ScriptTextEditingControl); } } public override Type ValueType { get { // Return the type of the value that CalendarCell contains. return typeof(String); } } public override object DefaultNewRowValue { get { // Use the current date and time as the default value. string code = @" #region //jackwangcumt #endregion using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace Host_Controls_in_Windows_Forms_DataGridView_Cells { public partial class SourceTextBox : UserControl { public SourceTextBox() { InitializeComponent(); this.textBox1.Location = this.Location; this.textBox1.Width = this.Width; this.textBox1.Height = this.Height; } protected void OnValueChanged(string text) { this.textBox1.Text = text; } private void btnSource_Click(object sender, EventArgs e) { ScriptEditor frm = new ScriptEditor(this.textBox1.Text); frm.ShowDialog(); this.textBox1.Text = frm.fastColoredTextBox1.Text; } } } "; return code; } } } //----------------------------------------------------------------- class ScriptTextEditingControl : SourceTextBox, IDataGridViewEditingControl { DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public ScriptTextEditingControl() { //文本变更更新到cell this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged); } void textBox1_TextChanged(object sender, EventArgs e) { // Notify the DataGridView that the contents of the cell // have changed. valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); //调用SourceTextBox的OnValueChanged(string Text) base.OnValueChanged(this.textBox1.Text); } // Implements the IDataGridViewEditingControl.EditingControlFormattedValue // property. public object EditingControlFormattedValue { get { return this.textBox1.Text; } set { if (value is String) { try { // This will throw an exception of the string is // null, empty, or not in the format of a date. this.textBox1.Text=((String)value); } catch { // In the case of an exception, just use the // default value so we're not left with a null // value. this.textBox1.Text = "jackwangcumt>>error"; } } } } // Implements the // IDataGridViewEditingControl.GetEditingControlFormattedValue method. public object GetEditingControlFormattedValue( DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } // Implements the // IDataGridViewEditingControl.ApplyCellStyleToEditingControl method. public void ApplyCellStyleToEditingControl( DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; //this.CalendarForeColor = dataGridViewCellStyle.ForeColor; //this.CalendarMonthBackground = dataGridViewCellStyle.BackColor; } // Implements the IDataGridViewEditingControl.EditingControlRowIndex // property. public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey // method. public bool EditingControlWantsInputKey( Keys key, bool dataGridViewWantsInputKey) { // Let the DateTimePicker handle the keys listed. switch (key & Keys.KeyCode) { case Keys.Left: case Keys.Up: case Keys.Down: case Keys.Right: case Keys.Home: case Keys.End: case Keys.PageDown: case Keys.PageUp: return true; default: return !dataGridViewWantsInputKey; } } // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit // method. public void PrepareEditingControlForEdit(bool selectAll) { // No preparation needs to be done. } // Implements the IDataGridViewEditingControl // .RepositionEditingControlOnValueChange property. public bool RepositionEditingControlOnValueChange { get { return false; } } // Implements the IDataGridViewEditingControl // .EditingControlDataGridView property. public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } // Implements the IDataGridViewEditingControl // .EditingControlValueChanged property. public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } // Implements the IDataGridViewEditingControl // .EditingPanelCursor property. public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnTextChanged(EventArgs e) { // Notify the DataGridView that the contents of the cell // have changed. valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnTextChanged(e); } } }
2 SourceTextBox
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace Host_Controls_in_Windows_Forms_DataGridView_Cells { public partial class SourceTextBox : UserControl { public SourceTextBox() { InitializeComponent(); this.textBox1.Location = this.Location; this.textBox1.Width = this.Width; this.textBox1.Height = this.Height; } protected void OnValueChanged(string text) { this.textBox1.Text = text; } private void btnSource_Click(object sender, EventArgs e) { ScriptEditor frm = new ScriptEditor(this.textBox1.Text); frm.ShowDialog(); this.textBox1.Text = frm.fastColoredTextBox1.Text; } } }
namespace Host_Controls_in_Windows_Forms_DataGridView_Cells { partial class SourceTextBox { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源。 /// </summary> /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region 组件设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.btnSource = new System.Windows.Forms.Button(); this.SuspendLayout(); // // textBox1 // this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; this.textBox1.Location = new System.Drawing.Point(3, 3); this.textBox1.Margin = new System.Windows.Forms.Padding(4); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(175, 21); this.textBox1.TabIndex = 1; // // btnSource // this.btnSource.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right))); this.btnSource.BackColor = System.Drawing.Color.Transparent; this.btnSource.BackgroundImage = global::Host_Controls_in_Windows_Forms_DataGridView_Cells.Resource.setting; this.btnSource.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom; this.btnSource.FlatAppearance.BorderColor = System.Drawing.Color.White; this.btnSource.FlatAppearance.BorderSize = 0; this.btnSource.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnSource.Font = new System.Drawing.Font("新宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.btnSource.Location = new System.Drawing.Point(159, -1); this.btnSource.Margin = new System.Windows.Forms.Padding(0); this.btnSource.Name = "btnSource"; this.btnSource.Size = new System.Drawing.Size(19, 25); this.btnSource.TabIndex = 0; this.btnSource.UseVisualStyleBackColor = false; this.btnSource.Click += new System.EventHandler(this.btnSource_Click); // // SourceTextBox // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.btnSource); this.Controls.Add(this.textBox1); this.Margin = new System.Windows.Forms.Padding(0); this.Name = "SourceTextBox"; this.Size = new System.Drawing.Size(178, 26); this.ResumeLayout(false); this.PerformLayout(); } #endregion public System.Windows.Forms.Button btnSource; public System.Windows.Forms.TextBox textBox1; } }
View Code
3 效果
相关文章推荐
- pp看书笔记---C#高级编程第九版 第五章 【泛型】
- 精准定位c#.net程序高cpu的故障点
- CLR via C#学习笔记---类型
- C# Socket与实现
- C#获取当前应用程序所在路径及环境变量
- C#相关问题
- 计算两个DateTime间的时间差(小时差、�586钟差、秒钟差等)
- C#对DataGridView进行添加、修改、删除数据操作
- C#自定义属性
- Visual Studio自动添加头部注释 -C#开发2010-2013验证
- C#生成图片缩略图(2种思路)
- C#访问非托管内存
- C#当中的多线程_线程同步
- C#自定义DataGridViewColumn显示TreeView
- C#中的new和override
- C#获取当前应用程序所在路径及环境变量
- C#给图片添加水印完整实例
- C#操作注册表的方法详解
- C# 获取时间差状态
- C# 正则表达式