DataGridVew的使用方法:
一:设置DataGridVew属性
private void CustomizeMyDataGridView()
{
// 由于我们要自订各个数据列类型,因此必须将 AutoGenerateColumns 属性设定成 False。
DataGridView1.AutoGenerateColumns = false;
// 允许手动重新调整数据列的位置。
DataGridView1.AllowUserToOrderColumns = true;
// 不允许使用者于 DataGridView 中删除数据行。
DataGridView1.AllowUserToDeleteRows = false;
// 不允许使用者于 DataGridView 中新增数据行。
DataGridView1.AllowUserToAddRows = false;
// 设定奇数资料列的背景色。
DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = SystemColors.InactiveCaptionText;
// 设定使用者一次只能选取一个单元格、数据列或数据行。
DataGridView1.MultiSelect = false;
// 设定采用单元格选取模式。
DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
// 设定数据行的高度。
this.DataGridView1.RowTemplate.Height = 30;
// 由于我们的 DataGridView 控件将会内含未绑定数据列,因此必须
// 将 VirtualMode 属性设定成 True,也就是必须启用虚拟模式。
DataGridView1.VirtualMode = true;
// 将 DataGridView 控件的数据源设定成 BindingSource 组件。
this.DataGridView1.DataSource = this.BindingSource1;
}
二:添加TextBox列
// 接下来的程序代码要自订各个数据列类型.....
/**********************************************/
//
// 数据列: 员工编号, 文本框
//
// 建立一个 DataGridViewTextBoxColumn 对象并设定其相关属性。
//
DataGridViewTextBoxColumn colEmployeeId = new DataGridViewTextBoxColumn();
// 设定来源字段。
colEmployeeId.DataPropertyName = "员工号码";
// 设定数据行标题。
colEmployeeId.HeaderText = "号码";
colEmployeeId.Name = "员工号码";
// 将此数据行设定成只读的。
colEmployeeId.ReadOnly = true;
// 设定数据行的宽度。
colEmployeeId.Width = 60;
// 将 DataGridViewTextBoxColumn 对象新增至 DataGridView 控件的数据行集合中。
DataGridView1.Columns.Add(colEmployeeId);
三:添加下拉框
//
// 数据列: 性别, 下拉列表框
//
// 建立一个 DataGridViewComboBoxColumn 对象并设定其相关属性。
//
DataGridViewComboBoxColumn colGender = new DataGridViewComboBoxColumn();
// 调整数据列的宽度使其足以显示出标题。
colGender.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
// 设定源字段。
colGender.DataPropertyName = "性别";
// 设定下拉列表中的选项。
colGender.Items.AddRange(new string[] { "男", "女" });
// 排序下拉列表框的内容。
colGender.Sorted = true;
// 停用数据行的排序功能。
colGender.SortMode = DataGridViewColumnSortMode.NotSortable;
colGender.HeaderText = "性别";
colGender.Name = "性别";
colGender.ReadOnly = false;
// 将 DataGridViewComboBoxColumn 对象新增至 DataGridView 控件的数据列集合中。
DataGridView1.Columns.Add(colGender);
四:添加数据库中未有列
//
// 数据列: 年龄, 未绑定的数据列
//
// 建立一个 DataGridViewTextBoxColumn 对象并设定其相关属性。
//
DataGridViewTextBoxColumn colAge = new DataGridViewTextBoxColumn();
// 调整数据列的宽度使其足以显示出标题。
colAge.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
colAge.HeaderText = "年龄";
colAge.Name = "年龄";
// 将此数据列设定成只读,毕竟年龄是根据出生日期所计算出来。
// 如果没有将此数据列设定成只读,则必须透过 CellValuePush 事件处理例程
// 将所输入的数据写入数据源。
colAge.ReadOnly = true;
// 设定当引发 DataGridView 控件的 CellValueNeeded 事件时所要执行的事件处理例程。
// 请特别注意,未系结资料行是透过 CellValueNeeded 事件来撷取数据。
DataGridView1.CellValueNeeded += new DataGridViewCellValueEventHandler(colAge_CellValueNeeded);
// 将 DataGridViewTextBoxColumn 对象新增至 DataGridView 控件的数据行集合中。
DataGridView1.Columns.Add(colAge);
// 此事件处理函数负责为未绑定数据列撷取数据。
private void colAge_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (e.ColumnIndex == ((DataGridView)(sender)).Columns["年龄"].Index)
{
int age;
DataTable Employees = myDataSet.Tables["章立民研究室"];
DateTime birthDate = (DateTime)(Employees.DefaultView[e.RowIndex]["出生日期"]);
age = DateTime.Today.Year - birthDate.Year;
if (DateTime.Today.DayOfYear < birthDate.DayOfYear)
{
age -= 1;
}
e.Value = age;
}
}
五:添加图像
//
// 数据列: 玉照, 图像框
//
// 建立一个 DataGridViewImageColumn 对象并设定其相关属性。
//
DataGridViewImageColumn colPhoto = new DataGridViewImageColumn();
// 设定来源字段。
colPhoto.DataPropertyName = "玉照";
colPhoto.HeaderText = "员工照片";
colPhoto.Name = "玉照";
colPhoto.ReadOnly = false;
// 调整数据行的宽度使其足以显示出标题。
colPhoto.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
// 设定影像的缩放方式。
colPhoto.ImageLayout = DataGridViewImageCellLayout.Stretch;
// 将 DataGridViewImageColumn 对象新增至 DataGridView 控件的数据行集合中。
DataGridView1.Columns.Add(colPhoto);
六:添加按钮
//
// 资料行: 检视完整照片, 按钮
//
// 此数据行并没有绑定到数据表的字段,它会以原始大小显示出「玉照」数据行的照片。
DataGridViewButtonColumn colShowPicture = new DataGridViewButtonColumn();
colShowPicture.HeaderText = "查看完整照片";
colShowPicture.Name = "查看完整照片";
colShowPicture.Text = "查看完整照片";
// 使用父数据列(也就是 colShowPicture)之 Text 属性的值作为所有按钮储存格的文字。
colShowPicture.UseColumnTextForButtonValue = true;
colShowPicture.ToolTipText = "单击按钮会显示出照片的初始大小";
colShowPicture.Width = 120;
DataGridView1.Columns.Add(colShowPicture);
// 处理此按钮的 Click 事件。
// 由于按钮数据列或单元格并没有事件,因此必须使用 DataGridView.CellContentClick 来处理之。
DataGridView1.CellContentClick += new DataGridViewCellEventHandler(colShowPicture_CellContentClick);
// 处理“查看完整照片”按钮的 Click 动作,以便在按钮旁显示出完整大小的照片。
private void colShowPicture_CellContentClick(Object sender, DataGridViewCellEventArgs e)
{
// 判断是否是「检视完整照片」按钮所引发。
// 如果使用者不是按一下储存格而是按一下数据列标题,则 e.RowIndex 会小于 0 。
if (e.RowIndex < 0 || e.ColumnIndex != this.DataGridView1.ColumnCount - 1)
{
return;
}
const int oleOffset = 78;
const int oleTypeStart = 20;
const int oleTypeLength = 12;
DataGridView dg = (DataGridView)(sender);
DataGridViewImageCell currentPhotoCell =
(DataGridViewImageCell)(dg.Rows[e.RowIndex].Cells[e.ColumnIndex - 1]);
byte[] imageBytes = (byte[])(currentPhotoCell.Value);
if (imageBytes == null || imageBytes.Length == 0)
{
return;
}
MemoryStream photoStream;
string type = System.Text.Encoding.ASCII.GetString(imageBytes, oleTypeStart, oleTypeLength);
if (type == "Bitmap Image")
{
photoStream = new MemoryStream(
imageBytes, oleOffset, imageBytes.Length - oleOffset);
}
else
{
photoStream = new MemoryStream(
imageBytes, 0, imageBytes.Length);
}
this.PictureBox1.Image = Image.FromStream(photoStream);
photoStream.Close();
// 设定 PictureBox 的位置。
this.PictureBox1.Location = new Point(this.PointToClient(MousePosition).X, (int)(this.PointToClient(MousePosition).Y - (this.PictureBox1.Height / 2)));
// 显示出 PictureBox。
this.PictureBox1.Visible = true;
this.PictureBox1.BringToFront();
this.PictureBox1.Focus();
}
六:添加复选框
// 数据列: 性别, 复选框
//
// 建立一个 DataGridViewCheckBoxColumn 对象并设定其相关属性。
//
DataGridViewCheckBoxColumn colGender = new DataGridViewCheckBoxColumn();
// 调整数据列的宽度使其足以显示出标题。
colGender.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
colGender.ThreeState = false;
colGender.TrueValue = 1;
colGender.FalseValue = 0;
colGender.DataPropertyName = "性别";
colGender.HeaderText = "性别";
colGender.Name = "性别";
DataGridView1.Columns.Add(colGender);
七:超链接
//
// 数据列: 直属主管编号, 超级链接
//
// 建立一个 DataGridViewLinkColumn 对象并设定其相关属性。
//
// 会在数据集当中搜寻直属主管的数据列,然后选取主管的姓名。
DataGridViewLinkColumn colManager = new DataGridViewLinkColumn();
// 由于此数据行是最后一个数据列,而且也位于最右侧,因此我们将其 AutoSizeMode 属性
// 设定成 DataGridViewAutoSizeColumnMode.Fill 使其填满 DataGridView 控件剩余的区域。
colManager.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
// 赋予此数据列一个最小大小。
colManager.MinimumWidth = 120;
colManager.DataPropertyName = "直属主管编号";
colManager.HeaderText = "直属主管编号";
colManager.LinkBehavior = LinkBehavior.AlwaysUnderline;
colManager.LinkBehavior = LinkBehavior.SystemDefault;
colManager.LinkColor = Color.Blue;
colManager.Name = "直属主管编号";
colManager.SortMode = DataGridViewColumnSortMode.Automatic;
DataGridView1.Columns.Add(colManager);
// 处理超级链接的 Click 事件。
// 由于超级链接并没有事件,因此必须使用 DataGridView.CellContentClick 来处理之。
// 事实上 DataGridViewLinkColumn 的运作模式非常类似于 DataGridViewButtonColumn,
// 两者只是外观不同罢了。
DataGridView1.CellContentClick += new DataGridViewCellEventHandler(colManager_CellContentClick);
// 我们冻结“姓名”数据列,如此一来,它本身以及其左侧的数据列将会固定住,而不会跟着水平卷动。
colName.Frozen = true;
// 处理“直属主管编号”的 Click 动作以便搜寻出主管的数据行。
private void colManager_CellContentClick(Object sender, DataGridViewCellEventArgs e)
{
DataGridView grid = (DataGridView)(sender);
// 确认是否确实是在“直属主管编号”数据列当中的超级链接上按一下。
if (e.RowIndex >= 0 && e.ColumnIndex == grid.Columns["直属主管编号"].Index)
{
// 从 DataGridView 控件的来源数据表中搜寻直属主管的数据行。
// 您不应该利用 e.RowIndex 属性从来源数据表中取得数据行,原因是如果
// 使用者执行了排序操作,它将不代表数据行在数据表中的原始位置。
int managerId = (int)(((DataRowView)(grid.Rows[e.RowIndex].DataBoundItem)).Row["直属主管编号"]);
bool boolFound = false;
foreach (DataGridViewRow row in grid.Rows)
{
// 使用 IsNewRow 属性来判断方格最下方的数据行是否为新数据行。
// 由于员工编号数据会内含于 DataGridView 控件中,因此您也可以
// 从 DataGridView 控件中取得员工编号。
// if(!row.IsNewRow && (int)(row.Cells["员工编号"].Value) == managerId)
// 亦或是如下所示,从来源资料表中取得:
if (!row.IsNewRow && (int)(((DataRowView)(row.DataBoundItem)).Row["员工编号"]) == managerId)
{
boolFound = true;
// 选取选取“姓名”单元格。
// 本程序范例是让 DataGridView 控件采用单元格选取模式,
// 如果是采用数据行选取模式,请执行 row.Selected = true; 。
row.Cells["姓名"].Selected = true;
break;
}
}
// 如果找不到直属主管的数据行,则显示一个对话框来告知使用者。
if (!boolFound)
{
MessageBox.Show("很抱歉,找不到直属主管的数据行。");
}
}
}