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

     

  • 相关阅读:
    设计模式(四)多例模式
    python之decode、encode及codecs模块
    python pyqt
    python读取命令行参数的方法
    python urllib、urlparse、urllib2、cookielib
    百度文档免费下载
    python之控制台(console)颜色显示
    python修改注册表
    python之爬虫
    xmlns和xsi之schemaLocation
  • 原文地址:https://www.cnblogs.com/isaboy/p/datagridview_source_code_editor.html
Copyright © 2020-2023  润新知