如何获取DataGridView中单元格内的控件?

时间:2021-07-04 16:22:52
我在DataGridView中增加了一列自定义控件的列,我如何能够获取到这一列中单元格内的控件并对其进行操作呢?

19 个解决方案

#1


该回复于2014-07-23 08:34:06被管理员删除

#2


如何获取DataGridView中单元格内的控件?

#3



 DataGridViewCell cell = this.dataGridView1.Rows[0].Cells[0];
cell.Value = 2;

通过Value设置值。

#4


通过rows属性

#5


如果知道列Index,可以this.dataGridView1.Rows[行号].Cells[列号];
如果知道列名,this.dataGridView1.Rows[行号].Cells[列名];

#6


引用 5 楼 save4me 的回复:
如果知道列Index,可以this.dataGridView1.Rows[行号].Cells[列号];
如果知道列名,this.dataGridView1.Rows[行号].Cells[列名];


大家的建议都是获取到cell,但是我需要获取到cell里面我添加的自定义控件,请问该怎么办呢?

#7


dataGridView只有单元格,单元格并不是容器,里面不能放控件
你加的自定义控件的列,仅仅是单元格类型不同,并不是里面有控件
所以最终还是只能操作单元格,不能直接对控件进行操作

#8


如果是Label :Label lbl=(Label)GridView1.Rows["行号"].FindControl("控件id")  

#9


引用 7 楼 Z65443344 的回复:
dataGridView只有单元格,单元格并不是容器,里面不能放控件
你加的自定义控件的列,仅仅是单元格类型不同,并不是里面有控件
所以最终还是只能操作单元格,不能直接对控件进行操作


我在这个单元格中设置了combobox,是我重写的颜色下拉框,但是不知道为什么,当点击其他行的下拉框时,之前选好颜色的下拉框又恢复为未选颜色的初始状态。有谁知道是什么原因导致的么?

#10


引用 8 楼 a475372067 的回复:
如果是Label :Label lbl=(Label)GridView1.Rows["行号"].FindControl("控件id")  


这个方法不存在

#11


他给的这个是Web控件的方法,不是WinForm的DataGridView,所以不存在
引用 10 楼 u013104783 的回复:
Quote: 引用 8 楼 a475372067 的回复:

如果是Label :Label lbl=(Label)GridView1.Rows["行号"].FindControl("控件id")  

这个方法不存在

#12


FindControl就行

#13


你的WinForm的DataGridView控件里面有FindControl方法?
引用 12 楼 zzx112358 的回复:
FindControl就行

#14


引用 13 楼 save4me 的回复:
你的WinForm的DataGridView控件里面有FindControl方法?
Quote: 引用 12 楼 zzx112358 的回复:

FindControl就行

好像是没有,我错了。谢谢。
不过为什么没有呢

#15


引用 14 楼 zzx112358 的回复:
Quote: 引用 13 楼 save4me 的回复:

你的WinForm的DataGridView控件里面有FindControl方法?
Quote: 引用 12 楼 zzx112358 的回复:

FindControl就行

好像是没有,我错了。谢谢。
不过为什么没有呢

参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器

#16


参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器 
->
是单元格,不是表格
表格都是容器,可以放东西,但是form的单元格不是容器

#17


引用 16 楼 Z65443344 的回复:
参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器 
->
是单元格,不是表格
表格都是容器,可以放东西,但是form的单元格不是容器

有一点点懂了

#18


引用 16 楼 Z65443344 的回复:
参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器 
->
是单元格,不是表格
表格都是容器,可以放东西,但是form的单元格不是容器


谢谢哈,貌似是这样的,虽然可以获得当前编辑的单元格中的控件,但是操作时出现很多问题,所以还是无法简单获取的。

#19


 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            DataGridView dgv = sender as DataGridView;          
            if (dgv.Columns[dgv.CurrentCell.ColumnIndex].Name == "Crop" && dgv.CurrentCell.RowIndex > -1)
            {
                DataGridViewComboBoxCell cell = dgv.Rows[dgv.CurrentCell.RowIndex].Cells["CropType"] as DataGridViewComboBoxCell;
                if (cell.Value != null && cell.Value.ToString() != "")
                {
                    string type = cell.Value.ToString();
                    string sqlfliter = " select CropType as PCROP from t_croptype where Type='" + type + "'";
                    DataTable dtf = TuiDBClass.ExecDataTable(sqlfliter);
                    if (dtf != null && dtf.Rows.Count > 0)
                    {
                        (e.Control as ComboBox).DataSource = dtf;
                        (e.Control as ComboBox).DisplayMember="PCROP";
                        (e.Control as ComboBox).ValueMember="PCROP";
                        (e.Control as ComboBox).BackColor = Color.White;
                        (e.Control as ComboBox).ForeColor = Color.Blue;
                    }
                }
            }
        }

其中                        (e.Control as ComboBox).DataSource = dtf;
                        (e.Control as ComboBox).DisplayMember="PCROP";
                        (e.Control as ComboBox).ValueMember="PCROP";
                        (e.Control as ComboBox).BackColor = Color.White;
                        (e.Control as ComboBox).ForeColor = Color.Blue;     就是你要的控件

#1


该回复于2014-07-23 08:34:06被管理员删除

#2


如何获取DataGridView中单元格内的控件?

#3



 DataGridViewCell cell = this.dataGridView1.Rows[0].Cells[0];
cell.Value = 2;

通过Value设置值。

#4


通过rows属性

#5


如果知道列Index,可以this.dataGridView1.Rows[行号].Cells[列号];
如果知道列名,this.dataGridView1.Rows[行号].Cells[列名];

#6


引用 5 楼 save4me 的回复:
如果知道列Index,可以this.dataGridView1.Rows[行号].Cells[列号];
如果知道列名,this.dataGridView1.Rows[行号].Cells[列名];


大家的建议都是获取到cell,但是我需要获取到cell里面我添加的自定义控件,请问该怎么办呢?

#7


dataGridView只有单元格,单元格并不是容器,里面不能放控件
你加的自定义控件的列,仅仅是单元格类型不同,并不是里面有控件
所以最终还是只能操作单元格,不能直接对控件进行操作

#8


如果是Label :Label lbl=(Label)GridView1.Rows["行号"].FindControl("控件id")  

#9


引用 7 楼 Z65443344 的回复:
dataGridView只有单元格,单元格并不是容器,里面不能放控件
你加的自定义控件的列,仅仅是单元格类型不同,并不是里面有控件
所以最终还是只能操作单元格,不能直接对控件进行操作


我在这个单元格中设置了combobox,是我重写的颜色下拉框,但是不知道为什么,当点击其他行的下拉框时,之前选好颜色的下拉框又恢复为未选颜色的初始状态。有谁知道是什么原因导致的么?

#10


引用 8 楼 a475372067 的回复:
如果是Label :Label lbl=(Label)GridView1.Rows["行号"].FindControl("控件id")  


这个方法不存在

#11


他给的这个是Web控件的方法,不是WinForm的DataGridView,所以不存在
引用 10 楼 u013104783 的回复:
Quote: 引用 8 楼 a475372067 的回复:

如果是Label :Label lbl=(Label)GridView1.Rows["行号"].FindControl("控件id")  

这个方法不存在

#12


FindControl就行

#13


你的WinForm的DataGridView控件里面有FindControl方法?
引用 12 楼 zzx112358 的回复:
FindControl就行

#14


引用 13 楼 save4me 的回复:
你的WinForm的DataGridView控件里面有FindControl方法?
Quote: 引用 12 楼 zzx112358 的回复:

FindControl就行

好像是没有,我错了。谢谢。
不过为什么没有呢

#15


引用 14 楼 zzx112358 的回复:
Quote: 引用 13 楼 save4me 的回复:

你的WinForm的DataGridView控件里面有FindControl方法?
Quote: 引用 12 楼 zzx112358 的回复:

FindControl就行

好像是没有,我错了。谢谢。
不过为什么没有呢

参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器

#16


参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器 
->
是单元格,不是表格
表格都是容器,可以放东西,但是form的单元格不是容器

#17


引用 16 楼 Z65443344 的回复:
参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器 
->
是单元格,不是表格
表格都是容器,可以放东西,但是form的单元格不是容器

有一点点懂了

#18


引用 16 楼 Z65443344 的回复:
参考我在7楼说的.WEB表格是容器,所以可以controls.add()
form表格不是容器 
->
是单元格,不是表格
表格都是容器,可以放东西,但是form的单元格不是容器


谢谢哈,貌似是这样的,虽然可以获得当前编辑的单元格中的控件,但是操作时出现很多问题,所以还是无法简单获取的。

#19


 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            DataGridView dgv = sender as DataGridView;          
            if (dgv.Columns[dgv.CurrentCell.ColumnIndex].Name == "Crop" && dgv.CurrentCell.RowIndex > -1)
            {
                DataGridViewComboBoxCell cell = dgv.Rows[dgv.CurrentCell.RowIndex].Cells["CropType"] as DataGridViewComboBoxCell;
                if (cell.Value != null && cell.Value.ToString() != "")
                {
                    string type = cell.Value.ToString();
                    string sqlfliter = " select CropType as PCROP from t_croptype where Type='" + type + "'";
                    DataTable dtf = TuiDBClass.ExecDataTable(sqlfliter);
                    if (dtf != null && dtf.Rows.Count > 0)
                    {
                        (e.Control as ComboBox).DataSource = dtf;
                        (e.Control as ComboBox).DisplayMember="PCROP";
                        (e.Control as ComboBox).ValueMember="PCROP";
                        (e.Control as ComboBox).BackColor = Color.White;
                        (e.Control as ComboBox).ForeColor = Color.Blue;
                    }
                }
            }
        }

其中                        (e.Control as ComboBox).DataSource = dtf;
                        (e.Control as ComboBox).DisplayMember="PCROP";
                        (e.Control as ComboBox).ValueMember="PCROP";
                        (e.Control as ComboBox).BackColor = Color.White;
                        (e.Control as ComboBox).ForeColor = Color.Blue;     就是你要的控件

#20