Winform DataGrid设计三步曲之二------如何在DataGrid中加入ComboBox控件
Winform DataGrid设计三步曲之二
如何在DataGrid中加入ComboBox控件
C#类库中的DataGrid控件功能非常强大,基本上可以应对一般的表格处理,但是对于特殊的要求,比如在DataGrid中加入单选框(ChechBox)和多选下拉菜单(ComboBox)时就要自己写一些代码了,在Framework1.1中的DataGrid并没有提供这方面的功能。下面介绍一种在DataGrid中加入ComboBox的方法。
1. 首先设置DataGrid的TableStyle
2. 然后利用DataGridTextBoxColumn中的TextBox.Controls属性把ComBoBox加入
3. 最后编写ComboBox的comboBox_SelectedIndexChanged事件,使修改可以保存回DataGrid的相应行。
如果对于TableStyle不太清楚,请参看我的前一篇文章
下面是程序的完整例子,在vs2003中测试通过,代码说明在程序中,关于TableStyle的说明请参看上一篇文章。添加ComboBox的代码主要在InitDataTable()函数中。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace DataGridBackColor
{
///<summary>
/// Form1 的摘要描述。
///</summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.DataGrid dataGrid;
private System.Windows.Forms.DataGridTableStyle TableStyle;
private System.Windows.Forms.DataGridBoolColumn Status;
private System.Windows.Forms.DataGridTextBoxColumn DataGridTextBox1;
private System.Windows.Forms.DataGridTextBoxColumn DataGridTextBox2;
private System.Windows.Forms.DataGridTextBoxColumn DataGridComboBox;
///<summary>
///设计工具所需的变数。
///</summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows Form 设计工具支持的必要项
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 呼叫之后加入任何建构函式程序代码
//
}
///<summary>
///清除任何使用中的资源。
///</summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form 设计工具产生的程序代码
///<summary>
///此为设计工具支持所必须的方法 - 请勿使用程序代码编辑器修改
///这个方法的内容。
///</summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.dataGrid = new System.Windows.Forms.DataGrid();
this.TableStyle = new System.Windows.Forms.DataGridTableStyle();
this.Status = new System.Windows.Forms.DataGridBoolColumn();
this.DataGridTextBox1 = new System.Windows.Forms.DataGridTextBoxColumn();
this.DataGridTextBox2 = new System.Windows.Forms.DataGridTextBoxColumn();
this.DataGridComboBox = new System.Windows.Forms.DataGridTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.dataGrid)).BeginInit();
this.SuspendLayout();
//
// dataGrid
//
this.dataGrid.CaptionText = "DataGrid Example";
this.dataGrid.DataMember = "";
this.dataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.dataGrid.Location = new System.Drawing.Point(0, 0);
this.dataGrid.Name = "dataGrid";
this.dataGrid.Size = new System.Drawing.Size(408, 238);
this.dataGrid.TabIndex = 0;
this.dataGrid.TableStyles.AddRange(new System.Windows.Forms.DataGridTableStyle[] {
this.TableStyle});
//
// TableStyle
//
this.TableStyle.AlternatingBackColor = System.Drawing.Color.Wheat;
this.TableStyle.BackColor = System.Drawing.Color.LightGray;
this.TableStyle.DataGrid = this.dataGrid;
this.TableStyle.ForeColor = System.Drawing.Color.MidnightBlue;
this.TableStyle.GridColumnStyles.AddRange(new System.Windows.Forms.DataGridColumnStyle[] {
this.Status,
this.DataGridTextBox1,
this.DataGridTextBox2,
this.DataGridComboBox});
this.TableStyle.GridLineColor = System.Drawing.Color.Black;
this.TableStyle.HeaderBackColor = System.Drawing.Color.LightBlue;
this.TableStyle.HeaderForeColor = System.Drawing.SystemColors.ControlText;
this.TableStyle.MappingName = "";
this.TableStyle.RowHeadersVisible = false;
this.TableStyle.SelectionBackColor = System.Drawing.Color.LightSkyBlue;
this.TableStyle.SelectionForeColor = System.Drawing.Color.WhiteSmoke;
//
// Status
//
this.Status.AllowNull = false;
this.Status.FalseValue = false;
this.Status.HeaderText = "Status";
this.Status.MappingName = "";
this.Status.NullText = "";
this.Status.NullValue = ((object)(resources.GetObject("Status.NullValue")));
this.Status.TrueValue = true;
this.Status.Width = 40;
//
// DataGridTextBox1
//
this.DataGridTextBox1.Format = "";
this.DataGridTextBox1.FormatInfo = null;
this.DataGridTextBox1.HeaderText = "TextBox1";
this.DataGridTextBox1.MappingName = "";
this.DataGridTextBox1.NullText = "";
this.DataGridTextBox1.ReadOnly = true;
this.DataGridTextBox1.Width = 75;
//
// DataGridTextBox2
//
this.DataGridTextBox2.Format = "";
this.DataGridTextBox2.FormatInfo = null;
this.DataGridTextBox2.HeaderText = "TextBox2";
this.DataGridTextBox2.MappingName = "";
this.DataGridTextBox2.NullText = "";
this.DataGridTextBox2.Width = 75;
//
// DataGridComboBox
//
this.DataGridComboBox.Format = "";
this.DataGridComboBox.FormatInfo = null;
this.DataGridComboBox.HeaderText = "ComboBox";
this.DataGridComboBox.MappingName = "";
this.DataGridComboBox.NullText = "";
this.DataGridComboBox.Width = 75;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 15);
this.ClientSize = new System.Drawing.Size(408, 238);
this.Controls.Add(this.dataGrid);
this.Name = "Form1";
this.Text = "DataGrid Example";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGrid)).EndInit();
this.ResumeLayout(false);
}
#endregion
///<summary>
///应用程序的主进入点。
///</summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
#region User Variable
private DataTable UserTable = null;
private DataView UserView = null;
#endregion
#region comboBox Event
private void Form1_Load(object sender, System.EventArgs e)
{
try
{
InitDataTable();
InitDataView();
InitDataGrid();
InitData();
}
catch( Exception ex )
{
MessageBox.Show( ex.Message );
}
}
private void comboBox_SelectedIndexChanged(object sender , System.EventArgs e)
{
//将修改写回dataGrid的相应行
if( dataGrid != null )
{
dataGrid[dataGrid.CurrentCell] = ((ComboBox)sender).SelectedItem.ToString();
}
}
#endregion
private void InitDataTable()
{
UserTable = new DataTable("UserTable");
DataColumn[] d = new DataColumn[4];
d[0] = new DataColumn("d0",typeof(bool));
d[1] = new DataColumn("d1",typeof(string));
d[2] = new DataColumn("d2",typeof(string));
d[3] = new DataColumn("d3",typeof(string));
UserTable.Columns.AddRange( d );
TableStyle.MappingName = "UserTable";
Status.MappingName = "d0";
DataGridTextBox1.MappingName = "d1";
DataGridTextBox2.MappingName = "d2";
DataGridComboBox.MappingName = "d3";
//创建一个新的ComboBox控件并设置其基本属性
ComboBox comboBox = new ComboBox();
comboBox.Items.AddRange( new object[]{ "Choose1" , "Choose2" , "Choose3" });
comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox.Dock = DockStyle.Fill;
DataGridComboBox.TextBox.Controls.Add( comboBox );//将comboBox加入DataGrid的相应行
//关联comboBox的SelectedIndexChanged事件
comboBox.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged);
}
private void InitDataView()
{
UserView = new DataView();
UserView.Table = UserTable;
UserView.AllowNew = false;
}
private void InitDataGrid()
{
dataGrid.DataSource = UserView;
}
private void InitData()
{
DataRow r = null;
for( int count = 1 ; count < 4 ; count++ )
{
r = UserTable.NewRow();
r[0] = true;
r[1] = "TextBox1" + count.ToString();
r[2] = "TextBox2" + count.ToString();
r[3] = "Choose" + count.ToString();
UserTable.Rows.Add( r );
}
}
}
}
运行结果如下:
在有些时候,DataGrid中不同行的值要以不同的颜色显示出来,比如告警,不同告警的背景色要不同,在下一篇文章中,我将介绍一下如何修改DataGrid的背景色问题。