Winform datagridview中显示下拉框示例

  方式一:如下图所示,该方式也是较为简单的一种。

     

Winform datagridview中显示下拉框示例_第1张图片

     你只需要添加一列类型为DataGridViewComboBoxColumn的列,然后添加数据源即可。但是我们看到这种方式的下拉列表看起来并不是十分的美观,至少我个人是这么觉得的。

     方式二:如下图所示。

      

Winform datagridview中显示下拉框示例_第2张图片

      如上所示,这样只有在每次点击特定列的单元格时,才会显示下拉列表。其实原理也非常简单,只需要在选择DataGridView的单元格时,判断是不是要显示下拉列表的列,如果是的话,将下拉列表显示在点击的单元格内,对原有的单元格进行覆盖。如果不是就隐藏下拉列表。当然细节部分请参考代码。

      现将部分代码贴出来供大家参考。

//将下拉列表加入到DataGridView的控件集合内,否则下拉列表不会显示在你点击的单元格上 
dataGridView1.Controls.Add(comboBox1);

      然后监听DataGridView的CurrentCellChanged事件,执行如下的动作:

private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
       {
           DataGridViewColumn column = dataGridView1.CurrentCell.OwningColumn;
           //如果是要显示下拉列表的列的话
           if (column.Name.Equals("Column2"))
           {
               int columnIndex = dataGridView1.CurrentCell.ColumnIndex;
               int rowIndex = dataGridView1.CurrentCell.RowIndex;
               Rectangle rect = dataGridView1.GetCellDisplayRectangle(columnIndex, rowIndex, false);
               comboBox1.Left = rect.Left;
               comboBox1.Top = rect.Top;
               comboBox1.Width = rect.Width;
               comboBox1.Height = rect.Height;
               //将单元格的内容显示为下拉列表的当前项
               string consultingRoom = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString();
               int index = comboBox1.Items.IndexOf(consultingRoom);

               comboBox1.SelectedIndex = index;
               comboBox1.Visible = true;
           }
           else
           {
               comboBox1.Visible = false;
           }
       }

       然后重绘下拉列表的每一项,如果不重绘的话,看不到下拉列表的每一项的内容,但是神奇的是可以选择(因为下拉列表此时是有内容的,只不过是没有显示出来)

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), e.Font, Brushes.Black,
                e.Bounds, StringFormat.GenericDefault);
        }

      最后在下拉列表选择项变化的时候,更改DataGridView相应的单元格的内容

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (dataGridView1.CurrentCell != null)
                dataGridView1.CurrentCell.Value = comboBox1.Items[comboBox1.SelectedIndex];
        }

你可能感兴趣的:(VS,c#,wpf,linq)