在DataGrid中使用下拉列表框和设置焦点

类别:.NET开发 点击:0 评论:0 推荐:

DataGrid中简单使用下拉列表框

作者:Tushar Ameta

翻译:秋枫

DataGrid中使用下拉列表问题。这篇文章讲了如何在 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等类似的控件。

 

本文地址:http://com.8s8s.com/it/it44722.htm