datagridview 第一列隐藏不了

时间:2022-06-10 14:46:57
为什么我的datagridview 总是隐藏不了第一列了?我的代码是这样的

    dgvMenu.Columns.Clear();
            dgvMenu.AutoGenerateColumns = false;
            DataGridViewTextBoxColumn No = new DataGridViewTextBoxColumn();
            No.HeaderText = "No";
            No.Width = 25;
            if (!(strtext.Contains(",No,")) && ("read".Equals(strString)))
                No.Visible = false;

            DataGridViewTextBoxColumn sMenuKey = new DataGridViewTextBoxColumn();
            sMenuKey.HeaderText = "菜单编号";
            if (!(strtext.Contains(",sMenuKey,")) && ("read".Equals(strString)))
                sMenuKey.Visible = false;

            DataGridViewTextBoxColumn sMenuText = new DataGridViewTextBoxColumn();
            sMenuText.HeaderText = "菜单名称";
            if (!(strtext.Contains(",sMenuText,")) && ("read".Equals(strString)))
                sMenuText.Visible = false;

            DataGridViewTextBoxColumn sIsFather = new DataGridViewTextBoxColumn();
            sIsFather.HeaderText = "是否父菜单";
            if (!(strtext.Contains(",sIsFather,")) && ("read".Equals(strString)))
                sIsFather.Visible = false;

            DataGridViewTextBoxColumn sFatherText = new DataGridViewTextBoxColumn();
            sFatherText.HeaderText = "父菜单名称";
            if (!(strtext.Contains(",sFatherText,")) && ("read".Equals(strString)))
                sFatherText.Visible = false;

            DataGridViewTextBoxColumn iMenuLevel = new DataGridViewTextBoxColumn();
            iMenuLevel.HeaderText = "菜单级别";
            if (!(strtext.Contains(",iMenuLevel,")) && ("read".Equals(strString)))
                iMenuLevel.Visible = false;

            DataGridViewTextBoxColumn sMenuPath = new DataGridViewTextBoxColumn();
            sMenuPath.HeaderText = "菜单路径";
            if (!(strtext.Contains(",sMenuPath,")) && ("read".Equals(strString)))
                sMenuPath.Visible = false;

            DataGridViewTextBoxColumn iMenuCount = new DataGridViewTextBoxColumn();
            iMenuCount.HeaderText = "显示顺序";
            if (!(strtext.Contains(",iMenuCount,")) && ("read".Equals(strString)))
                iMenuCount.Visible = false;

            DataGridViewTextBoxColumn sRemark = new DataGridViewTextBoxColumn();
            sRemark.HeaderText = "备注";
            if (!(strtext.Contains(",sRemark,")) && ("read".Equals(strString)))
                sRemark.Visible = false;

            if (dt != null)
            {
                if (dt.Rows.Count > 0)
                {
                    if (!dt.Columns.Contains("No"))
                        dt.Columns.Add("No");
                    dgvMenu.DataSource = dt;
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        dt.Rows[i]["No"] = i + 1;
                        if ("Y".Equals(dt.Rows[i]["sIsFather"].ToString()))
                            dt.Rows[i]["sIsFather"] = "是";
                        else
                            dt.Rows[i]["sIsFather"] = "否";
                    }
                    No.DataPropertyName = dt.Columns["No"].ColumnName;                    //映射到X列
                    sMenuKey.DataPropertyName = dt.Columns["sMenuKey"].ColumnName;
                    sMenuText.DataPropertyName = dt.Columns["sMenuText"].ColumnName;
                    sIsFather.DataPropertyName = dt.Columns["sIsFather"].ColumnName;
                    sFatherText.DataPropertyName = dt.Columns["sFatherText"].ColumnName;
                    iMenuLevel.DataPropertyName = dt.Columns["iMenuLevel"].ColumnName;
                    sMenuPath.DataPropertyName = dt.Columns["sMenuPath"].ColumnName;
                    iMenuCount.DataPropertyName = dt.Columns["iMenuCount"].ColumnName;
                    sRemark.DataPropertyName = dt.Columns["sRemark"].ColumnName;
                }
            }
            dgvMenu.Columns.Add(No);
            dgvMenu.Columns.Add(sMenuKey);
            dgvMenu.Columns.Add(sMenuText);
            dgvMenu.Columns.Add(sIsFather);
            dgvMenu.Columns.Add(sFatherText);
            dgvMenu.Columns.Add(iMenuLevel);
            dgvMenu.Columns.Add(sMenuPath);
            dgvMenu.Columns.Add(iMenuCount);
            dgvMenu.Columns.Add(sRemark);

我是自己定义的列,可是当全部列的Visible =false 时,第一列总是出现,也就是不管是哪列,只要它在第一列的位置就不隐藏,请问这是为什么,我都弄了好几天了,找不出原因!!!还请高手帮帮我

68 个解决方案

#1


对了,我的程序是winform 下的C# 。

#2


因为第一列包含一个当前单元格,也就是CurrentCell

你试着把CurrentCell改到第二列看是不是第二列也不能隐藏了

你看能不能把currentcell值为null,再设置Visible =false

#3


不行呀! 我试了把currentcell值为null 还是隐藏不了 !

#4


高手!请帮助我吧!阿门

#5


能否问一下,你隐藏全部的列目的是什么

#6


还没试过这种,不过帮你顶一下

#7


有个变态搞法
你是手动添进来的,也可以手动删除全部列
下次需要的时候再手动添进来

#8


帮顶!

#9


学习 帮顶~

#10


this.dataGridView1.Columns[0].Visible = false;

#11


引用 10 楼 ojlovecd 的回复:
this.dataGridView1.Columns[0].Visible = false;

这种方法我用过了,不行的。
请问还有没有人知道呀

#12


this.dataGridView1.Columns[0].Visible = false; 

#13


 this.dataGridView2.Columns[0].Visible = false;

我刚才试验了,这么做是好使的。

跟踪也是True吗?

#14


引用 11 楼 rogerlovewjh 的回复:
引用 10 楼 ojlovecd 的回复:
this.dataGridView1.Columns[0].Visible = false;

这种方法我用过了,不行的。
请问还有没有人知道呀

大家都行就你不行的话就要考虑一下是不是你的代码的问题了

#15


dgvMenu.DataSource = dt;
注掉这个试试

#16


第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见

#17


引用 16 楼 wjq 的回复:
第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来 
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见

我要让所有的列全部隐藏,而我这个隐藏是通过设置来实现的,我设置哪个隐藏就隐藏哪个,现在问题是,我设置了所有的列不隐藏,可是还是有一列隐藏不了

#18


哦,学习中,这个挺不错的.

#19


引用 17 楼 rogerlovewjh 的回复:
引用 16 楼 wjq 的回复:
第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来 
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见 
 
我要让所有的列全部隐藏,而我这个隐藏是通过设置来实现的,我设置哪个隐藏就隐藏哪个,现在问题是,我设置了所有的列不隐藏,可是还是有一列隐藏不了


没有太看明白,楼主的意思是不是说把所有的列都隐藏了,但还是有一列无法隐藏啊?
如果是这个意思的话,那你隐藏不了的应该是“行标题列”

只要设置一下就行
this.dataGridView1.RowHeadersVisible = false;

#20


引用 14 楼 ojlovecd 的回复:
 
大家都行就你不行的话就要考虑一下是不是你的代码的问题了


对头

#21


回去再在电脑上复制一下代码..

#22


if (!(strtext.Contains(",No,")) && ("read".Equals(strString)))
                No.Visible = false;
====================
你确认你的if条件成立?

#23


引用 12 楼 zt_100094 的回复:
this.dataGridView1.Columns[0].Visible = false; 

#24


所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法

#25


引用 24 楼 wjq 的回复:
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法


你真的用反编译器看过底层了吗?
我就用例子实现了隐藏所有列
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了
隐藏所有列后,执行一句
this.dataGridView1.RowHeadersVisible = false;
就实现了

#26


引用 25 楼 pp_shy 的回复:
引用 24 楼 wjq 的回复:
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法 
 

你真的用反编译器看过底层了吗? 
我就用例子实现了隐藏所有列 
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了 
隐藏所有列后,执行一句 
thi…
            DataTable dt = new DataTable();
            dt.Columns.Add("T1");
            dt.Columns.Add("T2");
            dt.Columns.Add("T3");
            dt.Rows.Add("1", "2", "3");
            dataGridView1.Columns.Clear();
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView1.Columns[0].DataPropertyName = "T1";
            dataGridView1.Columns[1].DataPropertyName = "T2";
            dataGridView1.Columns[2].DataPropertyName = "T3";
            dataGridView1.Columns[0].Visible = false;
            dataGridView1.Columns[1].Visible = false;
            dataGridView1.Columns[2].Visible = false;
            MessageBox.Show("Before databind:columns1.visible:"+dataGridView1.Columns[0].Visible.ToString());
            dataGridView1.DataSource = dt;
            MessageBox.Show("After databind:columns1.visible:" + dataGridView1.Columns[0].Visible.ToString());

非常明显了吧,DataBind之后,会自动修改第一列的可见性为True. 你说你实现了,能不能把代码贴上来,大家学习一下

#27


另外,再看下反编译的代码,当然一层层调用,我就把最后修改首列为可见的函数贴出来

public void MatchCurrencyManagerPosition(bool scrollIntoView, bool clearSelection)
{
    if (this.owner.Columns.Count != 0)
    {
        int columnIndex = (this.owner.CurrentCellAddress.X == -1) ? this.owner.FirstDisplayedColumnIndex : this.owner.CurrentCellAddress.X;
        if (columnIndex == -1)
        {
            DataGridViewColumn firstColumn = this.owner.Columns.GetFirstColumn(DataGridViewElementStates.None);
            firstColumn.Visible = true;

            columnIndex = firstColumn.Index;
        }
        int position = this.currencyManager.Position;
        if (position == -1)
        {
            if (!this.owner.SetCurrentCellAddressCore(-1, -1, false, false, false))
            {
                throw new InvalidOperationException(SR.GetString("DataGridView_CellChangeCannotBeCommittedOrAborted"));
            }
        }
        else if (position < this.owner.Rows.Count)
        {
            if ((this.owner.Rows.GetRowState(position) & DataGridViewElementStates.Visible) == DataGridViewElementStates.None)
            {
                this.owner.Rows[position].Visible = true;
            }
            if (((position != this.owner.CurrentCellAddress.Y) || (columnIndex != this.owner.CurrentCellAddress.X)) && ((scrollIntoView && !this.owner.ScrollIntoView(columnIndex, position, true)) || (((columnIndex < this.owner.Columns.Count) && (position < this.owner.Rows.Count)) && !this.owner.SetAndSelectCurrentCellAddress(columnIndex, position, true, false, false, clearSelection, false))))
            {
                throw new InvalidOperationException(SR.GetString("DataGridView_CellChangeCannotBeCommittedOrAborted"));
            }
        }
    }
}

#28


当然,其实可以在设置了DataSource属性之后再对第一列进行隐藏......= =||

#29


引用 26 楼 wjq 的回复:
引用 25 楼 pp_shy 的回复:
引用 24 楼 wjq 的回复: 
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法 


你真的用反编译器看过底层了吗? 
我就用例子实现了隐藏所有列 
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了 
隐…


你没有看楼主的代码吗?他用的是自定义列啊
都自定义列了还会用DataSource赋值吗,那他要自定义列干嘛?
肯定是用this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });的方式赋值啊。
或者就是用VirtualMode = true 的方式来自行管理数据的啊

#30


26、27、28楼的这位仁兄。
你用我上面说的方式试试
this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });//添加数据
包你能隐藏掉

#31


god,自定义列就一定不用datasource绑定么?难道兄弟你只用自动生成列榜定?....
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。

都说了,自动显示第一列是GV数据邦定的策略, 而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.

#32


实现代码例子:

this.dataGridView1.RowHeadersVisible = false;//隐藏行标题列

//为dataGridView1创建2列
DataGridViewTextBoxColumn ColumnID = new DataGridViewTextBoxColumn();
ColumnID.Name = "id";
ColumnID.HeaderText = "ID号";

DataGridViewTextBoxColumn ColumnName = new DataGridViewTextBoxColumn();
ColumnName.Name = "name";
ColumnName.HeaderText = "名称";

this.dataGridView1.Columns.AddRange(new DataGridViewColumn[] { ColumnID, ColumnName });

//隐藏创建的2列
this.dataGridView1.Columns[0].Visible = false;
this.dataGridView1.Columns[1].Visible = false;

//模拟数据,如果DataTable就循环添加一行行的数据
this.dataGridView1.Rows.Add(new object[] { "1", "小李" });
this.dataGridView1.Rows.Add(new object[] { "2", "小王" });


wjq兄你自己可以跑跑看,看是不是都隐藏掉了

#33


引用 31 楼 wjq 的回复:
god,自定义列就一定不用datasource绑定么?难道兄弟你只用自动生成列榜定?.... 
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。 

都说了,自动显示第一列是GV数据邦定的策略,而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.


你知道不知道VirtualMode方式啊,难道datasource绑定就一定慢?

#34


上面说错了,应该是“难道不用datasource绑定就一定慢”?

#35


我都说了自动显示第一列式DataSource绑定时候干的事了.不否认你一个个加不会触发MatchCurrencyManagerPosition方法.
不是说不用Datasource一定慢,而是很难做到比DataSource快.

同样的效果,如果花大量的时间干ms已经给你实现的功能,那还有什么意义?.NET在于快速开发,ms封了那么多东西,就在于“把开发者从重复性的劳动中解放出来,专注于业务方面的逻辑”。
再总结一下:
1:第一列必定要显示这是DataSource数据绑定的内部逻辑。
2:实在要隐藏第一列,可以在数据绑定后再设置第一列可见=false
3:你一个条条Add当然是可以的,也避免了DataSource时自动设置首列可见,只是貌似没必要去做ms已经实现的功能
以上。如果同意我这3条,当然也没啥好争论的了。

#36


所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法

#37


大家争论什么呀
关键是能实现楼主的需求就行了

#38


this.dataGridView1.Columns[0].Visible = false;

#39


bool fv=dataGridView1.Columns[0].Visible;
dataGridView1.DataSource = dt; 
dataGridView1.Columns[0].Visible = fv;

#40


首先非常感谢大家热心的回复我的贴,其次,我再说一下我这个功能的作用和出现的问题:

作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。

问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就是说不管那一列,只要它在第一列的位置就隐藏不了,而其列的位置则可以隐藏。

还请高手能有办法解决我的问题,谢谢!!!

#41


请问有没有能够解决我的问题的方法

#42


路过,学习

#43


应该是个简单的问题,自己复杂化了

#44


高手~~~~~~~~~~~~~~~~~~~~~~~~~~~~,请进!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

#45


引用 40 楼 rogerlovewjh 的回复:
首先非常感谢大家热心的回复我的贴,其次,我再说一下我这个功能的作用和出现的问题: 

作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。 

问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就…

lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.

#46


lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.


我之前就是这样做到的,但还是不行呀!还是会出现的

#47


Sure?
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见.....
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?

#48


你绑定数据源之后
设置 this.dataGridView1.AutoGenerateColumns = false;
再隐藏某一列看行不
不行的话,上网查一查!!

#49


引用 47 楼 wjq 的回复:
Sure? 
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见..... 
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?

没有,我的代码在最上面,那就是我的现在用的代码了!

#50


引用 48 楼 qiaoguangyan86 的回复:
你绑定数据源之后 
设置 this.dataGridView1.AutoGenerateColumns = false; 
再隐藏某一列看行不 
不行的话,上网查一查!!

如果你在绑定数据源后在进行this.dataGridView1.AutoGenerateColumns = false; 的设置,那么它不会将自动增长列去掉。

#1


对了,我的程序是winform 下的C# 。

#2


因为第一列包含一个当前单元格,也就是CurrentCell

你试着把CurrentCell改到第二列看是不是第二列也不能隐藏了

你看能不能把currentcell值为null,再设置Visible =false

#3


不行呀! 我试了把currentcell值为null 还是隐藏不了 !

#4


高手!请帮助我吧!阿门

#5


能否问一下,你隐藏全部的列目的是什么

#6


还没试过这种,不过帮你顶一下

#7


有个变态搞法
你是手动添进来的,也可以手动删除全部列
下次需要的时候再手动添进来

#8


帮顶!

#9


学习 帮顶~

#10


this.dataGridView1.Columns[0].Visible = false;

#11


引用 10 楼 ojlovecd 的回复:
this.dataGridView1.Columns[0].Visible = false;

这种方法我用过了,不行的。
请问还有没有人知道呀

#12


this.dataGridView1.Columns[0].Visible = false; 

#13


 this.dataGridView2.Columns[0].Visible = false;

我刚才试验了,这么做是好使的。

跟踪也是True吗?

#14


引用 11 楼 rogerlovewjh 的回复:
引用 10 楼 ojlovecd 的回复:
this.dataGridView1.Columns[0].Visible = false;

这种方法我用过了,不行的。
请问还有没有人知道呀

大家都行就你不行的话就要考虑一下是不是你的代码的问题了

#15


dgvMenu.DataSource = dt;
注掉这个试试

#16


第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见

#17


引用 16 楼 wjq 的回复:
第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来 
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见

我要让所有的列全部隐藏,而我这个隐藏是通过设置来实现的,我设置哪个隐藏就隐藏哪个,现在问题是,我设置了所有的列不隐藏,可是还是有一列隐藏不了

#18


哦,学习中,这个挺不错的.

#19


引用 17 楼 rogerlovewjh 的回复:
引用 16 楼 wjq 的回复:
第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来 
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见 
 
我要让所有的列全部隐藏,而我这个隐藏是通过设置来实现的,我设置哪个隐藏就隐藏哪个,现在问题是,我设置了所有的列不隐藏,可是还是有一列隐藏不了


没有太看明白,楼主的意思是不是说把所有的列都隐藏了,但还是有一列无法隐藏啊?
如果是这个意思的话,那你隐藏不了的应该是“行标题列”

只要设置一下就行
this.dataGridView1.RowHeadersVisible = false;

#20


引用 14 楼 ojlovecd 的回复:
 
大家都行就你不行的话就要考虑一下是不是你的代码的问题了


对头

#21


回去再在电脑上复制一下代码..

#22


if (!(strtext.Contains(",No,")) && ("read".Equals(strString)))
                No.Visible = false;
====================
你确认你的if条件成立?

#23


引用 12 楼 zt_100094 的回复:
this.dataGridView1.Columns[0].Visible = false; 

#24


所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法

#25


引用 24 楼 wjq 的回复:
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法


你真的用反编译器看过底层了吗?
我就用例子实现了隐藏所有列
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了
隐藏所有列后,执行一句
this.dataGridView1.RowHeadersVisible = false;
就实现了

#26


引用 25 楼 pp_shy 的回复:
引用 24 楼 wjq 的回复:
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法 
 

你真的用反编译器看过底层了吗? 
我就用例子实现了隐藏所有列 
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了 
隐藏所有列后,执行一句 
thi…
            DataTable dt = new DataTable();
            dt.Columns.Add("T1");
            dt.Columns.Add("T2");
            dt.Columns.Add("T3");
            dt.Rows.Add("1", "2", "3");
            dataGridView1.Columns.Clear();
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView1.Columns[0].DataPropertyName = "T1";
            dataGridView1.Columns[1].DataPropertyName = "T2";
            dataGridView1.Columns[2].DataPropertyName = "T3";
            dataGridView1.Columns[0].Visible = false;
            dataGridView1.Columns[1].Visible = false;
            dataGridView1.Columns[2].Visible = false;
            MessageBox.Show("Before databind:columns1.visible:"+dataGridView1.Columns[0].Visible.ToString());
            dataGridView1.DataSource = dt;
            MessageBox.Show("After databind:columns1.visible:" + dataGridView1.Columns[0].Visible.ToString());

非常明显了吧,DataBind之后,会自动修改第一列的可见性为True. 你说你实现了,能不能把代码贴上来,大家学习一下

#27


另外,再看下反编译的代码,当然一层层调用,我就把最后修改首列为可见的函数贴出来

public void MatchCurrencyManagerPosition(bool scrollIntoView, bool clearSelection)
{
    if (this.owner.Columns.Count != 0)
    {
        int columnIndex = (this.owner.CurrentCellAddress.X == -1) ? this.owner.FirstDisplayedColumnIndex : this.owner.CurrentCellAddress.X;
        if (columnIndex == -1)
        {
            DataGridViewColumn firstColumn = this.owner.Columns.GetFirstColumn(DataGridViewElementStates.None);
            firstColumn.Visible = true;

            columnIndex = firstColumn.Index;
        }
        int position = this.currencyManager.Position;
        if (position == -1)
        {
            if (!this.owner.SetCurrentCellAddressCore(-1, -1, false, false, false))
            {
                throw new InvalidOperationException(SR.GetString("DataGridView_CellChangeCannotBeCommittedOrAborted"));
            }
        }
        else if (position < this.owner.Rows.Count)
        {
            if ((this.owner.Rows.GetRowState(position) & DataGridViewElementStates.Visible) == DataGridViewElementStates.None)
            {
                this.owner.Rows[position].Visible = true;
            }
            if (((position != this.owner.CurrentCellAddress.Y) || (columnIndex != this.owner.CurrentCellAddress.X)) && ((scrollIntoView && !this.owner.ScrollIntoView(columnIndex, position, true)) || (((columnIndex < this.owner.Columns.Count) && (position < this.owner.Rows.Count)) && !this.owner.SetAndSelectCurrentCellAddress(columnIndex, position, true, false, false, clearSelection, false))))
            {
                throw new InvalidOperationException(SR.GetString("DataGridView_CellChangeCannotBeCommittedOrAborted"));
            }
        }
    }
}

#28


当然,其实可以在设置了DataSource属性之后再对第一列进行隐藏......= =||

#29


引用 26 楼 wjq 的回复:
引用 25 楼 pp_shy 的回复:
引用 24 楼 wjq 的回复: 
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法 


你真的用反编译器看过底层了吗? 
我就用例子实现了隐藏所有列 
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了 
隐…


你没有看楼主的代码吗?他用的是自定义列啊
都自定义列了还会用DataSource赋值吗,那他要自定义列干嘛?
肯定是用this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });的方式赋值啊。
或者就是用VirtualMode = true 的方式来自行管理数据的啊

#30


26、27、28楼的这位仁兄。
你用我上面说的方式试试
this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });//添加数据
包你能隐藏掉

#31


god,自定义列就一定不用datasource绑定么?难道兄弟你只用自动生成列榜定?....
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。

都说了,自动显示第一列是GV数据邦定的策略, 而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.

#32


实现代码例子:

this.dataGridView1.RowHeadersVisible = false;//隐藏行标题列

//为dataGridView1创建2列
DataGridViewTextBoxColumn ColumnID = new DataGridViewTextBoxColumn();
ColumnID.Name = "id";
ColumnID.HeaderText = "ID号";

DataGridViewTextBoxColumn ColumnName = new DataGridViewTextBoxColumn();
ColumnName.Name = "name";
ColumnName.HeaderText = "名称";

this.dataGridView1.Columns.AddRange(new DataGridViewColumn[] { ColumnID, ColumnName });

//隐藏创建的2列
this.dataGridView1.Columns[0].Visible = false;
this.dataGridView1.Columns[1].Visible = false;

//模拟数据,如果DataTable就循环添加一行行的数据
this.dataGridView1.Rows.Add(new object[] { "1", "小李" });
this.dataGridView1.Rows.Add(new object[] { "2", "小王" });


wjq兄你自己可以跑跑看,看是不是都隐藏掉了

#33


引用 31 楼 wjq 的回复:
god,自定义列就一定不用datasource绑定么?难道兄弟你只用自动生成列榜定?.... 
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。 

都说了,自动显示第一列是GV数据邦定的策略,而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.


你知道不知道VirtualMode方式啊,难道datasource绑定就一定慢?

#34


上面说错了,应该是“难道不用datasource绑定就一定慢”?

#35


我都说了自动显示第一列式DataSource绑定时候干的事了.不否认你一个个加不会触发MatchCurrencyManagerPosition方法.
不是说不用Datasource一定慢,而是很难做到比DataSource快.

同样的效果,如果花大量的时间干ms已经给你实现的功能,那还有什么意义?.NET在于快速开发,ms封了那么多东西,就在于“把开发者从重复性的劳动中解放出来,专注于业务方面的逻辑”。
再总结一下:
1:第一列必定要显示这是DataSource数据绑定的内部逻辑。
2:实在要隐藏第一列,可以在数据绑定后再设置第一列可见=false
3:你一个条条Add当然是可以的,也避免了DataSource时自动设置首列可见,只是貌似没必要去做ms已经实现的功能
以上。如果同意我这3条,当然也没啥好争论的了。

#36


所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的. 
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧 
除非继承gv,自己重写相关方法

#37


大家争论什么呀
关键是能实现楼主的需求就行了

#38


this.dataGridView1.Columns[0].Visible = false;

#39


bool fv=dataGridView1.Columns[0].Visible;
dataGridView1.DataSource = dt; 
dataGridView1.Columns[0].Visible = fv;

#40


首先非常感谢大家热心的回复我的贴,其次,我再说一下我这个功能的作用和出现的问题:

作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。

问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就是说不管那一列,只要它在第一列的位置就隐藏不了,而其列的位置则可以隐藏。

还请高手能有办法解决我的问题,谢谢!!!

#41


请问有没有能够解决我的问题的方法

#42


路过,学习

#43


应该是个简单的问题,自己复杂化了

#44


高手~~~~~~~~~~~~~~~~~~~~~~~~~~~~,请进!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

#45


引用 40 楼 rogerlovewjh 的回复:
首先非常感谢大家热心的回复我的贴,其次,我再说一下我这个功能的作用和出现的问题: 

作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。 

问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就…

lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.

#46


lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.


我之前就是这样做到的,但还是不行呀!还是会出现的

#47


Sure?
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见.....
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?

#48


你绑定数据源之后
设置 this.dataGridView1.AutoGenerateColumns = false;
再隐藏某一列看行不
不行的话,上网查一查!!

#49


引用 47 楼 wjq 的回复:
Sure? 
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见..... 
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?

没有,我的代码在最上面,那就是我的现在用的代码了!

#50


引用 48 楼 qiaoguangyan86 的回复:
你绑定数据源之后 
设置 this.dataGridView1.AutoGenerateColumns = false; 
再隐藏某一列看行不 
不行的话,上网查一查!!

如果你在绑定数据源后在进行this.dataGridView1.AutoGenerateColumns = false; 的设置,那么它不会将自动增长列去掉。