DataGridView的使用

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("很抱歉,找不到直属主管的数据行。");
                }
            }
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值