C#中为DataGrid添加下拉列表框 WinForm

    技术2022-05-11  140

    在 System.Windows.Forms.DataGrid中切入使用ComboBox控件,主要包括三方面的内容。    1. 在DataGrid中加入ComboBox列;    2. 把在DataGrid中的修改保存到对应的网格;    3. 设置DataGrid中网格的焦点。 下面是整个源代码,一些功能可以看注释。 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace DataGridTest {   public class Form1 : System.Windows.Forms.Form   {    private System.Windows.Forms.DataGrid dgdFunctionArea;    private DataTable dtblFunctionalArea;    private System.Windows.Forms.Button buttonFocus;    private System.ComponentModel.Container components = null;    public Form1()    {     InitializeComponent();     PopulateGrid();    }    protected override void Dispose( bool disposing )    {     if( disposing )     {      if (components != null)      {       components.Dispose();      }     }     base.Dispose( disposing );    }    #region Windows 窗体设计器生成的代码    private void InitializeComponent()    {     this.dgdFunctionArea = new System.Windows.Forms.DataGrid();     this.buttonFocus = new System.Windows.Forms.Button();    ((System.ComponentModel.ISupportInitialize)(this.dgdFunctionArea)).BeginInit();     this.SuspendLayout();     //     // dgdFunctionArea     //     this.dgdFunctionArea.DataMember = "";     this.dgdFunctionArea.HeaderForeColor = System.Drawing.SystemColors.ControlText;     this.dgdFunctionArea.Location = new System.Drawing.Point(4, 8);     this.dgdFunctionArea.Name = "dgdFunctionArea";     this.dgdFunctionArea.Size = new System.Drawing.Size(316, 168);     this.dgdFunctionArea.TabIndex = 0;     //     // buttonFocus     //     this.buttonFocus.Location = new System.Drawing.Point(232, 188);     this.buttonFocus.Name = "buttonFocus";     this.buttonFocus.Size = new System.Drawing.Size(84, 23);     this.buttonFocus.TabIndex = 1;     this.buttonFocus.Text = "获取焦点";     this.buttonFocus.Click += new System.EventHandler(this.buttonFocus_Click);     //     // Form1     //     this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);     this.ClientSize = new System.Drawing.Size(332, 217);     this.Controls.Add(this.buttonFocus);     this.Controls.Add(this.dgdFunctionArea);     this.Name = "Form1";     this.Text = "Form1";     ((System.ComponentModel.ISupportInitialize)(this.dgdFunctionArea)).EndInit();     this.ResumeLayout(false);    }    #endregion    /// <summary>    /// 应用程序的主入口点。    /// </summary>    [STAThread]    static void Main()    {     Application.Run(new Form1());    }    //初始化DataGrid    private void PopulateGrid()    {     //创建一个DataTable对象,包括四列,前三列为String,最后一列为Boolean。     dtblFunctionalArea = new DataTable ("FunctionArea");     string[] arrstrFunctionalArea = new string [3]{"Functional Area","Min","Max"};     DataColumn dtCol = null;     //创建String列     for(int i=0; i< 3;i++)     {      dtCol = new DataColumn(arrstrFunctionalArea[i]);      dtCol.DataType = Type.GetType("System.String");      dtCol.DefaultValue = "";      dtblFunctionalArea.Columns.Add(dtCol);     }     //创建Boolean列,用CheckedBox来显示。     DataColumn dtcCheck = new DataColumn("IsMandatory");     dtcCheck.DataType = System.Type.GetType("System.Boolean");     dtcCheck.DefaultValue = false;     dtblFunctionalArea.Columns.Add(dtcCheck);     //把表绑定到DataGrid     dgdFunctionArea.DataSource = dtblFunctionalArea;     //为DataGrid加载DataGridTableStyle样式     if(!dgdFunctionArea.TableStyles.Contains("FunctionArea"))     {      DataGridTableStyle dgdtblStyle = new DataGridTableStyle();      dgdtblStyle.MappingName = dtblFunctionalArea.TableName;      dgdFunctionArea.TableStyles.Add(dgdtblStyle);      dgdtblStyle.RowHeadersVisible = false;      dgdtblStyle.HeaderBackColor = Color.LightSteelBlue;      dgdtblStyle.AllowSorting = false;      dgdtblStyle.HeaderBackColor = Color.FromArgb(8,36,107);      dgdtblStyle.RowHeadersVisible = false;      dgdtblStyle.HeaderForeColor = Color.White;      dgdtblStyle.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 9F,      System.Drawing.FontStyle.Bold,      System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));      dgdtblStyle.GridLineColor = Color.DarkGray;      dgdtblStyle.PreferredRowHeight = 22;      dgdFunctionArea.BackgroundColor = Color.White;      //设置列的宽度      GridColumnStylesCollection colStyle = dgdFunctionArea.TableStyles[0].GridColumnStyles;      colStyle[0].Width = 100;      colStyle[1].Width = 50;      colStyle[2].Width = 50;      colStyle[3].Width = 80;     }     DataGridTextBoxColumn dgtb = (DataGridTextBoxColumn)dgdFunctionArea.TableStyles[0].GridColumnStyles[0];     ComboBox cmbFunctionArea = new ComboBox();     cmbFunctionArea.Items.AddRange(new object[]{"选项一","选项二","选项三"});     cmbFunctionArea.Cursor = Cursors.Arrow;     cmbFunctionArea.DropDownStyle= ComboBoxStyle.DropDownList;     cmbFunctionArea.Dock = DockStyle.Fill;     //在选定项发生更改并且提交了该更改后发生     cmbFunctionArea.SelectionChangeCommitted += new  EventHandler(cmbFunctionArea_SelectionChangeCommitted);     //把ComboBox添加到DataGridTableStyle的第一列     dgtb.TextBox.Controls.Add(cmbFunctionArea);    }    //设置焦点模拟    private void GetFocus(int row,int col)    {     //先把焦点移动到DataGrid     this.dgdFunctionArea.Focus();     //把焦点移动到DataGridCell     DataGridCell dgc = new DataGridCell(row,col);     this.dgdFunctionArea.CurrentCell = dgc;     DataGridTextBoxColumn dgtb = (DataGridTextBoxColumn)dgdFunctionArea.TableStyles[0].GridColumnStyles[col];     //设置焦点     dgtb.TextBox.Focus();    }    //把Combobox上修改的数据提交到当前的网格   private void cmbFunctionArea_SelectionChangeCommitted(object sender, EventArgs e)   {    this.dgdFunctionArea[this.dgdFunctionArea.CurrentCell] = ((ComboBox)sender).SelectedItem.ToString();   }   //设置新的焦点   private void buttonFocus_Click(object sender, System.EventArgs e)   {    //焦点模拟,这里设置第三行第一列    GetFocus(2,0);   } } }

    这里是通过DataGridTextBoxColumn.TextBox.Controls.Add方法实现在列中添加ComboBox控件;对于数据的保存是使用ComboBox.SelectionChangeCommitted事件来完成;设置焦点是通过DataGridTextBoxColumn.TextBox.Focus方法来实现。另外通过这个方法也可以添加DateTimePicker等类似的控件。 


    最新回复(0)