`
ljl_xyf
  • 浏览: 634082 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在DataGridView控件中加入ComboBox下拉列表框的实现(C#)

    博客分类:
  • c#
阅读更多

  虽然在Visual Studio中 DataGridView控件的DataGridViewComboBoxColumn可以实现下拉列表框,但这样的列会在整列中都显示下拉列表框,不太 美观,而且还要用代码实现数据绑定。本文介绍一种只在当前编辑单元格中显示下拉列表框的方法,供大家参考。

  首先新建一个Windows应用程序,将主窗体重命名为MainForm,在MainForm中加入一个DataGridView控件,命名为dgv_User。如下图所示:


  打开窗体代码窗口,在代码窗口中声明一个ComboBox的控件

//  定义下拉列表框
private  ComboBox cmb_Temp  =   new  ComboBox();

  我们要绑定的下拉列表框的功能是选择性别,添加如下绑定性别下拉列表框的方法

///   <summary>
///  绑定性别下拉列表框
///   </summary>
private   void  BindSex()
{
    DataTable dtSex 
=   new  DataTable();
    dtSex.Columns.Add(
" Value " );
    dtSex.Columns.Add(
" Name " );
    DataRow drSex;
    drSex 
=  dtSex.NewRow();
    drSex[
0 =   " 1 " ;
    drSex[
1 =   " " ;
    dtSex.Rows.Add(drSex);
    drSex 
=  dtSex.NewRow();
    drSex[
0 =   " 0 " ;
    drSex[
1 =   " " ;
    dtSex.Rows.Add(drSex);
    cmb_Temp.ValueMember 
=   " Value " ;
    cmb_Temp.DisplayMember 
=   " Name " ;
    cmb_Temp.DataSource 
=  dtSex;
    cmb_Temp.DropDownStyle 
=  ComboBoxStyle.DropDownList;
}

  通常情况下我们都是从数据库中获取数据表(或者数据集),然后绑定到DataGridView中的,这里我们为了避免连接数据库,手中构造一个数据库表,代码如下:

private   void  BindData()
{
    DataTable dtData 
=   new  DataTable();
    dtData.Columns.Add(
" ID " );
    dtData.Columns.Add(
" Name " );
    dtData.Columns.Add(
" Sex " );
    DataRow drData;
    drData 
=  dtData.NewRow();
    drData[
0 =   1 ;
    drData[
1 =   " 张三 " ;
    drData[
2 =   " 1 " ;
    dtData.Rows.Add(drData);
    drData 
=  dtData.NewRow();
    drData[
0 =   2 ;
    drData[
1 =   " 400电话 " ;
    drData[
2 =   " 1 " ;
    dtData.Rows.Add(drData);
    drData 
=  dtData.NewRow();
    drData[
0 =   3 ;
    drData[
1 =   " 王五 " ;
    drData[
2 =   " 1 " ;
    dtData.Rows.Add(drData);
    drData 
=  dtData.NewRow();
    drData[
0 =   4 ;
    drData[
1 =   " 小芳 " ;
    drData[
2 =   " 0 " ;
    dtData.Rows.Add(drData);
    drData 
=  dtData.NewRow();
    drData[
0 =   5 ;
    drData[
1 =   " 小娟 " ;
    drData[
2 =   " 0 " ;
    dtData.Rows.Add(drData);
    drData 
=  dtData.NewRow();
    drData[
0 =   6 ;
    drData[
1 =   " 赵六 " ;
    drData[
2 =   " 1 " ;
    dtData.Rows.Add(drData);
    
this .dgv_User.DataSource  =  dtData;
}

  为窗体加载事件添加如下方法,其具体功能有详细说明:

private   void  MainForm_Load( object  sender, EventArgs e)
{
    
//  绑定性别下拉列表框
    BindSex();

    
// 绑定数据表
    BindData();

    
//  设置下拉列表框不可见
    cmb_Temp.Visible  =   false ;

    
//  添加下拉列表框事件
    cmb_Temp.SelectedIndexChanged  +=   new  EventHandler(cmb_Temp_SelectedIndexChanged);

    
//  将下拉列表框加入到DataGridView控件中
     this .dgv_User.Controls.Add(cmb_Temp);
}

 

  当用户选择的单元格移动到性别这一列时,我们要显示下拉列表框,添加如下事件

private   void  dgv_User_CurrentCellChanged( object  sender, EventArgs e)
{
    
try
    {
        
if  ( this .dgv_User.CurrentCell.ColumnIndex  ==   2 )
        {
            Rectangle rect 
=  dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex,  false );
            
string  sexValue  =  dgv_User.CurrentCell.Value.ToString();
            
if  (sexValue  ==   " 1 " )
            {
                cmb_Temp.Text 
=   " " ;
            }
            
else
            {
                cmb_Temp.Text 
=   " " ;
            }
            cmb_Temp.Left 
=  rect.Left;
            cmb_Temp.Top 
=  rect.Top;
            cmb_Temp.Width 
=  rect.Width;
            cmb_Temp.Height 
=  rect.Height;
            cmb_Temp.Visible 
=   true ;
        }
        
else
        {
            cmb_Temp.Visible 
=   false ;
        }
    }
    
catch
    {
    }
}

  当用户选择下拉列表框时改变DataGridView单元格的内容

private   void  cmb_Temp_SelectedIndexChanged( object  sender, EventArgs e)
{
    
if  (((ComboBox)sender).Text  ==   " " )
    {
        dgv_User.CurrentCell.Value 
=   " " ;
        dgv_User.CurrentCell.Tag 
=   " 1 " ;
    }
    
else
    {
        dgv_User.CurrentCell.Value 
=   " " ;
        dgv_User.CurrentCell.Tag 
=   " 0 " ;
    }
}

  当滚动DataGridView或者改变DataGridView列宽时将下拉列表框设为不可见

private   void  dgv_User_Scroll( object  sender, ScrollEventArgs e)
{
    
this .cmb_Temp.Visible  =   false ;
}

private   void  dgv_User_ColumnWidthChanged( object  sender, DataGridViewColumnEventArgs e)
{
    
this .cmb_Temp.Visible  =   false ;
}

  绑定数据表后将性别列中的每一单元格的Value和Tag属性(Tag为值文本,Value为显示文本)

private   void  dgv_User_DataBindingComplete( object  sender, DataGridViewBindingCompleteEventArgs e)
{
    
for  ( int  i  =   0 ; i  <   this .dgv_User.Rows.Count; i ++ )
    {
        
if  (dgv_User.Rows[i].Cells[ 2 ].Value  !=   null   &&  dgv_User.Rows[i].Cells[ 2 ].ColumnIndex  ==   2 )
        {
            dgv_User.Rows[i].Cells[
2 ].Tag  =  dgv_User.Rows[i].Cells[ 2 ].Value.ToString();
            
if  (dgv_User.Rows[i].Cells[ 2 ].Value.ToString()  ==   " 1 " )
            {
                dgv_User.Rows[i].Cells[
2 ].Value  =   " " ;
            }
            
else   if  (dgv_User.Rows[i].Cells[ 2 ].Value.ToString()  ==   " 0 " )
            {
                dgv_User.Rows[i].Cells[
2 ].Value  =   " " ;
            }
        }
    }
}

  效果如下图所示:


  完整的代码如下:

using  System;
using  System.Data;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;

namespace  MyNameSpace
{
    
public   partial   class  MainForm : Form
    {
        
//  定义下拉列表框
         private  ComboBox cmb_Temp  =   new  ComboBox();

        
public  MainForm()
        {
            InitializeComponent();
        }

        
///   <summary>
        
///  绑定性别下拉列表框
        
///   </summary>
         private   void  BindSex()
        {
            DataTable dtSex 
=   new  DataTable();
            dtSex.Columns.Add(
" Value " );
            dtSex.Columns.Add(
" Name " );
            DataRow drSex;
            drSex 
=  dtSex.NewRow();
            drSex[
0 =   " 1 " ;
            drSex[
1 =   " " ;
            dtSex.Rows.Add(drSex);
            drSex 
=  dtSex.NewRow();
            drSex[
0 =   " 0 " ;
            drSex[
1 =   " " ;
            dtSex.Rows.Add(drSex);
            cmb_Temp.ValueMember 
=   " Value " ;
            cmb_Temp.DisplayMember 
=   " Name " ;
            cmb_Temp.DataSource 
=  dtSex;
            cmb_Temp.DropDownStyle 
=  ComboBoxStyle.DropDownList;
        }

        
///   <summary>
        
///  为避免连接数据库,这里手工构造数据表,实际应用中应从数据库中获取
        
///   </summary>
         private   void  BindData()
        {
            DataTable dtData 
=   new  DataTable();
            dtData.Columns.Add(
" ID " );
            dtData.Columns.Add(
" Name " );
            dtData.Columns.Add(
" Sex " );
            DataRow drData;
            drData 
=  dtData.NewRow();
            drData[
0 =   1 ;
            drData[
1 =   " 张三 " ;
            drData[
2 =   " 1 " ;
            dtData.Rows.Add(drData);
            drData 
=  dtData.NewRow();
            drData[
0 =   2 ;
            drData[
1 =   "http://www.baidu.com " ;
            drData[
2 =   " 1 " ;
            dtData.Rows.Add(drData);
            drData 
=  dtData.NewRow();
            drData[
0 =   3 ;
            drData[
1 =   " http://www.my00800.cn " ;
            drData[
2 =   " 1 " ;
            dtData.Rows.Add(drData);
            drData 
=  dtData.NewRow();
            drData[
0 =   4 ;
            drData[
1 =   " http://www.google.com " ;
            drData[
2 =   " 0 " ;
            dtData.Rows.Add(drData);
            drData 
=  dtData.NewRow();
            drData[
0 =   5 ;
            drData[
1 =   " 小娟 " ;
            drData[
2 =   " 0 " ;
            dtData.Rows.Add(drData);
            drData 
=  dtData.NewRow();
            drData[
0 =   6 ;
            drData[
1 =   " 赵六 " ;
            drData[
2 =   " 1 " ;
            dtData.Rows.Add(drData);
            
this .dgv_User.DataSource  =  dtData;
        }

        
private   void  MainForm_Load( object  sender, EventArgs e)
        {
            
//  绑定性别下拉列表框
            BindSex();

            
// 绑定数据表
            BindData();

            
//  设置下拉列表框不可见
            cmb_Temp.Visible  =   false ;

            
//  添加下拉列表框事件
            cmb_Temp.SelectedIndexChanged  +=   new  EventHandler(cmb_Temp_SelectedIndexChanged);

            
//  将下拉列表框加入到DataGridView控件中
             this .dgv_User.Controls.Add(cmb_Temp);
        }

        
//  当用户移动到性别这一列时单元格显示下拉列表框
         private   void  dgv_User_CurrentCellChanged( object  sender, EventArgs e)
        {
            
try
            {
                
if  ( this .dgv_User.CurrentCell.ColumnIndex  ==   2 )
                {
                    Rectangle rect 
=  dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex,  false );
                    
string  sexValue  =  dgv_User.CurrentCell.Value.ToString();
                    
if  (sexValue  ==   " 1 " )
                    {
                        cmb_Temp.Text 
=   " " ;
                    }
                    
else
                    {
                        cmb_Temp.Text 
=   " " ;
                    }
                    cmb_Temp.Left 
=  rect.Left;
                    cmb_Temp.Top 
=  rect.Top;
                    cmb_Temp.Width 
=  rect.Width;
                    cmb_Temp.Height 
=  rect.Height;
                    cmb_Temp.Visible 
=   true ;
                }
                
else
                {
                    cmb_Temp.Visible 
=   false ;
                }
            }
            
catch
            {
            }
        }

        
//  当用户选择下拉列表框时改变DataGridView单元格的内容
         private   void  cmb_Temp_SelectedIndexChanged( object  sender, EventArgs e)
        {
            
if  (((ComboBox)sender).Text  ==   " " )
            {
                dgv_User.CurrentCell.Value 
=   " " ;
                dgv_User.CurrentCell.Tag 
=   " 1 " ;
            }
            
else
            {
                dgv_User.CurrentCell.Value 
=   " " ;
                dgv_User.CurrentCell.Tag 
=   " 0 " ;
            }
        }

        
//  滚动DataGridView时将下拉列表框设为不可见
         private   void  dgv_User_Scroll( object  sender, ScrollEventArgs e)
        {
            
this .cmb_Temp.Visible  =   false ;
        }

        
//  改变DataGridView列宽时将下拉列表框设为不可见
         private   void  dgv_User_ColumnWidthChanged( object  sender, DataGridViewColumnEventArgs e)
        {
            
this .cmb_Temp.Visible  =   false ;
        }

        
//  绑定数据表后将性别列中的每一单元格的Value和Tag属性(Tag为值文本,Value为显示文本)
         private   void  dgv_User_DataBindingComplete( object  sender, DataGridViewBindingCompleteEventArgs e)
        {
            
for  ( int  i  =   0 ; i  <   this .dgv_User.Rows.Count; i ++ )
            {
                
if  (dgv_User.Rows[i].Cells[ 2 ].Value  !=   null   &&  dgv_User.Rows[i].Cells[ 2 ].ColumnIndex  ==   2 )
                {
                    dgv_User.Rows[i].Cells[
2 ].Tag  =  dgv_User.Rows[i].Cells[ 2 ].Value.ToString();
                    
if  (dgv_User.Rows[i].Cells[ 2 ].Value.ToString()  ==   " 1 " )
                    {
                        dgv_User.Rows[i].Cells[
2 ].Value  =   " " ;
                    }
                    
else   if  (dgv_User.Rows[i].Cells[ 2 ].Value.ToString()  ==   " 0 " )
                    {
                        dgv_User.Rows[i].Cells[
2 ].Value  =   " " ;
                    }
                }
            }
        }
    }
}

 

  文章很长,希望能给您带来帮助。

  • 大小: 7.6 KB
  • 大小: 10.4 KB
分享到:
评论

相关推荐

    DataGridView控件中加入ComboBox下拉列表框

    在本篇文章中,我们将深入探讨如何在`DataGridView`中集成`ComboBox`下拉列表框,以及相关的实现细节和应用场景。 首先,我们需要理解`DataGridView`和`ComboBox`的基本用法。`DataGridView`是一个可自定义的数据...

    在DataGridView控件中加入ComboBox下拉列表框的实现

    通过以上步骤,我们便成功地在`DataGridView`中加入了`ComboBox`下拉列表框。这种实现方式允许用户在编辑单元格时看到并选择下拉列表中的选项,提高了数据输入的效率和准确性。 总结一下,本篇文章主要介绍了如何在...

    在DataGridView控件中加入ComboBox下拉列表框的实现案例

    而为了增强用户交互和提供更多的操作选项,有时我们需要在`DataGridView`的单元格中集成`ComboBox`控件,这样用户就可以从下拉列表中选择值。本案例将详细介绍如何在`DataGridView`中实现`ComboBox`下拉列表的功能。...

    C#DataGridView中ComboBox下拉更改事件

    在 C# DataGridView 中实现 ComboBox 下拉更改事件需要通过在 EditingControlShowing 事件中添加 SelectedIndexChanged 事件,并在 SelectedIndexChanged 事件中根据当前选中的班级,自动刷新班主任和名次。

    datagridview中使用combobox下拉列表框,datetimepicker 日期选择框

    在.NET框架中,尤其是C#开发Windows应用程序时,`DataGridView`是常用的数据展示控件,而`ComboBox`和`DateTimePicker`则是增强用户交互的重要工具。`DataGridView`用于显示表格形式的数据,`ComboBox`用于提供下拉...

    C#WinForm中DataGridView表头下拉列表

    1. **创建下拉列表**:使用`ComboBox`控件或者自定义控件来创建下拉列表,填充表头列中的所有唯一值。 2. **事件处理**:监听用户点击表头时的事件,如`MouseClick`,并在适当的时候显示或隐藏下拉列表。 3. **筛选...

    c# DataGridView中添加下拉列表

    本文将详细介绍如何在C#的`DataGridView`中添加下拉列表,并提供相关的实现步骤和技巧。 首先,我们需要在`DataGridView`的某一列上设置`DataGridViewComboBoxColumn`。这个列类型专门用于显示下拉列表。下面是一个...

    datagridview使用combobox进行二级联动

    在Windows Forms应用开发中,`DataGridView`控件是用于展示数据表格的强大工具,而`ComboBox`控件则常用于提供下拉选项选择。当需要实现二级联动效果时,即一个`ComboBox`的选择会影响到另一个`ComboBox`的选项,...

    DataGridView列头添加下拉列表实现数据过滤

    2. **下拉列表实现**:在列头单元格中嵌入下拉列表(通常是`ComboBox`控件)可让用户选择过滤条件。这需要在自定义单元格类中添加方法来创建和管理这个下拉列表,如设置列表项、处理用户选择等。 3. **事件处理**:...

    C# datagridView 控件使用心得

    在Windows桌面应用中,datagridview控件是一个非常重要的组件,它允许用户以表格形式展示和操作数据。本篇文章将深入探讨C#中datagridview控件的使用心得,包括其基本功能、数据绑定、自定义操作和事件处理等方面。 ...

    C#中为DataGrid添加下拉列表框

    总结,通过以上三个步骤,我们成功地在C#的DataGrid中添加了下拉列表框。这个功能对于那些需要用户从预定义选项中选择值的应用场景非常有用,提高了用户界面的友好性和数据输入的准确性。在实际开发中,可能还需要...

    自定义的C#DataGridView下拉列表单元格

    本例通过在EditingControlFormattedValue中返回combobox的selecteditem , 在自定义单元格控件时重写GetValue,GetFormattedValue 解决了 显示时显示的是绑定的实际值,而输入选择时显示的是显示的字段的问题. 具体实现...

    C# DataGridView控件使用全攻略

    ### C# DataGridView 控件使用全攻略 #### 一、何为 DataGridView **1.1 DataGridView 和 DataGrid 之间的区别** DataGridView 控件是 .NET Framework 2.0 中引入的一个全新的表格控件,用来替代之前的 DataGrid ...

    表格控件中下拉列表框的使用例子

    2. **添加下拉列表框列**:在表格控件中,为特定列设置ComboBox列类型。这通常涉及编程语言中对应的API调用,比如在C#中,可以使用`DataGridViewComboBoxColumn`类。 3. **填充下拉列表**:定义下拉列表的选项,...

    c# datagridview 下拉框

    在C#编程中,`DataGridView`控件是一个非常常用的数据展示工具,它可以显示表格形式的数据。在实际应用中,我们经常需要在`DataGridView`的某一列中添加下拉框(ComboBox)来提供用户选择特定值的功能。这既提高了...

    C#_DataGridView控件使用全攻略

    ### C# DataGridView 控件使用全攻略 #### 一、何为 DataGridView **1.1 DataGridView 和 DataGrid 之间的区别** `DataGridView` 是 .NET Framework 2.0 中引入的一个全新的表格控件,用来替代之前的 `DataGrid` ...

    C# 在datagridview中任何一列加下拉框

    在C#开发中,我们经常会遇到需要在DataGridView控件中实现特定列的编辑功能,而为了增强用户体验并限制用户输入,我们可能希望将某个单元格转换为下拉框(ComboBox)。这种情况下,用户只能从预设的选项中选择,而...

    DataGridView单元格实现下拉和编辑功能设置代码

    // 将下拉列表框加入到DataGridView控件中 this.dgv_User.Controls.Add(cmb_Temp); // 隐藏ComboBox cmb_Temp.Visible = false; // 添加下拉列表框事件 cmb_Temp.SelectedIndexChanged += new EventHandler...

    C#动态绑定datagridview单元格控件

    通过上述步骤,我们可以实现在 DataGridView 中动态绑定 ComboBox 控件的功能。这种方法非常适合需要对数据进行编辑的应用场景,尤其是在需要提供多个选项的情况下。需要注意的是,在实际开发过程中可能还需要考虑更...

Global site tag (gtag.js) - Google Analytics