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
你试着把CurrentCell改到第二列看是不是第二列也不能隐藏了
你看能不能把currentcell值为null,再设置Visible =false
#3
不行呀! 我试了把currentcell值为null 还是隐藏不了 !
#4
高手!请帮助我吧!阿门
#5
能否问一下,你隐藏全部的列目的是什么
#6
还没试过这种,不过帮你顶一下
#7
有个变态搞法
你是手动添进来的,也可以手动删除全部列
下次需要的时候再手动添进来
你是手动添进来的,也可以手动删除全部列
下次需要的时候再手动添进来
#8
帮顶!
#9
学习 帮顶~
#10
this.dataGridView1.Columns[0].Visible = false;
#11
这种方法我用过了,不行的。
请问还有没有人知道呀
#12
this.dataGridView1.Columns[0].Visible = false;
#13
this.dataGridView2.Columns[0].Visible = false;
我刚才试验了,这么做是好使的。
跟踪也是True吗?
我刚才试验了,这么做是好使的。
跟踪也是True吗?
#14
大家都行就你不行的话就要考虑一下是不是你的代码的问题了
#15
dgvMenu.DataSource = dt;
注掉这个试试
注掉这个试试
#16
第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见
#17
我要让所有的列全部隐藏,而我这个隐藏是通过设置来实现的,我设置哪个隐藏就隐藏哪个,现在问题是,我设置了所有的列不隐藏,可是还是有一列隐藏不了
#18
哦,学习中,这个挺不错的.
#19
没有太看明白,楼主的意思是不是说把所有的列都隐藏了,但还是有一列无法隐藏啊?
如果是这个意思的话,那你隐藏不了的应该是“行标题列”
只要设置一下就行
this.dataGridView1.RowHeadersVisible = false;
#20
对头
#21
回去再在电脑上复制一下代码..
#22
if (!(strtext.Contains(",No,")) && ("read".Equals(strString)))
No.Visible = false;
====================
你确认你的if条件成立?
No.Visible = false;
====================
你确认你的if条件成立?
#23
#24
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法
#25
你真的用反编译器看过底层了吗?
我就用例子实现了隐藏所有列
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了
隐藏所有列后,执行一句
this.dataGridView1.RowHeadersVisible = false;
就实现了
#26
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. 你说你实现了,能不能把代码贴上来,大家学习一下
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
你没有看楼主的代码吗?他用的是自定义列啊
都自定义列了还会用DataSource赋值吗,那他要自定义列干嘛?
肯定是用this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });的方式赋值啊。
或者就是用VirtualMode = true 的方式来自行管理数据的啊
#30
26、27、28楼的这位仁兄。
你用我上面说的方式试试
this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });//添加数据
包你能隐藏掉
你用我上面说的方式试试
this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });//添加数据
包你能隐藏掉
#31
god,自定义列就一定不用datasource绑定么?难道兄弟你只用自动生成列榜定?....
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。
都说了,自动显示第一列是GV数据邦定的策略, 而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。
都说了,自动显示第一列是GV数据邦定的策略, 而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.
#32
实现代码例子:
wjq兄你自己可以跑跑看,看是不是都隐藏掉了
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
你知道不知道VirtualMode方式啊,难道datasource绑定就一定慢?
#34
上面说错了,应该是“难道不用datasource绑定就一定慢”?
#35
我都说了自动显示第一列式DataSource绑定时候干的事了.不否认你一个个加不会触发MatchCurrencyManagerPosition方法.
不是说不用Datasource一定慢,而是很难做到比DataSource快.
同样的效果,如果花大量的时间干ms已经给你实现的功能,那还有什么意义?.NET在于快速开发,ms封了那么多东西,就在于“把开发者从重复性的劳动中解放出来,专注于业务方面的逻辑”。
再总结一下:
1:第一列必定要显示这是DataSource数据绑定的内部逻辑。
2:实在要隐藏第一列,可以在数据绑定后再设置第一列可见=false
3:你一个条条Add当然是可以的,也避免了DataSource时自动设置首列可见,只是貌似没必要去做ms已经实现的功能
以上。如果同意我这3条,当然也没啥好争论的了。
不是说不用Datasource一定慢,而是很难做到比DataSource快.
同样的效果,如果花大量的时间干ms已经给你实现的功能,那还有什么意义?.NET在于快速开发,ms封了那么多东西,就在于“把开发者从重复性的劳动中解放出来,专注于业务方面的逻辑”。
再总结一下:
1:第一列必定要显示这是DataSource数据绑定的内部逻辑。
2:实在要隐藏第一列,可以在数据绑定后再设置第一列可见=false
3:你一个条条Add当然是可以的,也避免了DataSource时自动设置首列可见,只是貌似没必要去做ms已经实现的功能
以上。如果同意我这3条,当然也没啥好争论的了。
#36
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法
前段时间也碰到过类似问题,都反编译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;
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].Visible = fv;
#40
首先非常感谢大家热心的回复我的贴,其次,我再说一下我这个功能的作用和出现的问题:
作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。
问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就是说不管那一列,只要它在第一列的位置就隐藏不了,而其列的位置则可以隐藏。
还请高手能有办法解决我的问题,谢谢!!!
作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。
问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就是说不管那一列,只要它在第一列的位置就隐藏不了,而其列的位置则可以隐藏。
还请高手能有办法解决我的问题,谢谢!!!
#41
请问有没有能够解决我的问题的方法
#42
路过,学习
#43
应该是个简单的问题,自己复杂化了
#44
高手~~~~~~~~~~~~~~~~~~~~~~~~~~~~,请进!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
#45
lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.
#46
lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.
我之前就是这样做到的,但还是不行呀!还是会出现的
我之前就是这样做到的,但还是不行呀!还是会出现的
#47
Sure?
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见.....
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见.....
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?
#48
你绑定数据源之后
设置 this.dataGridView1.AutoGenerateColumns = false;
再隐藏某一列看行不
不行的话,上网查一查!!
设置 this.dataGridView1.AutoGenerateColumns = false;
再隐藏某一列看行不
不行的话,上网查一查!!
#49
没有,我的代码在最上面,那就是我的现在用的代码了!
#50
如果你在绑定数据源后在进行this.dataGridView1.AutoGenerateColumns = false; 的设置,那么它不会将自动增长列去掉。
#1
对了,我的程序是winform 下的C# 。
#2
因为第一列包含一个当前单元格,也就是CurrentCell
你试着把CurrentCell改到第二列看是不是第二列也不能隐藏了
你看能不能把currentcell值为null,再设置Visible =false
你试着把CurrentCell改到第二列看是不是第二列也不能隐藏了
你看能不能把currentcell值为null,再设置Visible =false
#3
不行呀! 我试了把currentcell值为null 还是隐藏不了 !
#4
高手!请帮助我吧!阿门
#5
能否问一下,你隐藏全部的列目的是什么
#6
还没试过这种,不过帮你顶一下
#7
有个变态搞法
你是手动添进来的,也可以手动删除全部列
下次需要的时候再手动添进来
你是手动添进来的,也可以手动删除全部列
下次需要的时候再手动添进来
#8
帮顶!
#9
学习 帮顶~
#10
this.dataGridView1.Columns[0].Visible = false;
#11
这种方法我用过了,不行的。
请问还有没有人知道呀
#12
this.dataGridView1.Columns[0].Visible = false;
#13
this.dataGridView2.Columns[0].Visible = false;
我刚才试验了,这么做是好使的。
跟踪也是True吗?
我刚才试验了,这么做是好使的。
跟踪也是True吗?
#14
大家都行就你不行的话就要考虑一下是不是你的代码的问题了
#15
dgvMenu.DataSource = dt;
注掉这个试试
注掉这个试试
#16
第一列必须是可见的,即便你设置不可见,.NET也会自动给你改回来
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见
所以,如果你这列要隐藏,就把他放到后面去,把要显示的列前面。总之,必须保证首列可见
#17
我要让所有的列全部隐藏,而我这个隐藏是通过设置来实现的,我设置哪个隐藏就隐藏哪个,现在问题是,我设置了所有的列不隐藏,可是还是有一列隐藏不了
#18
哦,学习中,这个挺不错的.
#19
没有太看明白,楼主的意思是不是说把所有的列都隐藏了,但还是有一列无法隐藏啊?
如果是这个意思的话,那你隐藏不了的应该是“行标题列”
只要设置一下就行
this.dataGridView1.RowHeadersVisible = false;
#20
对头
#21
回去再在电脑上复制一下代码..
#22
if (!(strtext.Contains(",No,")) && ("read".Equals(strString)))
No.Visible = false;
====================
你确认你的if条件成立?
No.Visible = false;
====================
你确认你的if条件成立?
#23
#24
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法
#25
你真的用反编译器看过底层了吗?
我就用例子实现了隐藏所有列
估计楼主无法去掉的那列是“行标题列”不是他自定义的列,这个只要修改下datagridview的属性就好了
隐藏所有列后,执行一句
this.dataGridView1.RowHeadersVisible = false;
就实现了
#26
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. 你说你实现了,能不能把代码贴上来,大家学习一下
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
你没有看楼主的代码吗?他用的是自定义列啊
都自定义列了还会用DataSource赋值吗,那他要自定义列干嘛?
肯定是用this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });的方式赋值啊。
或者就是用VirtualMode = true 的方式来自行管理数据的啊
#30
26、27、28楼的这位仁兄。
你用我上面说的方式试试
this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });//添加数据
包你能隐藏掉
你用我上面说的方式试试
this.dataGridView1.Rows.Add(new object[] { "值一", "值二", ..., "值N" });//添加数据
包你能隐藏掉
#31
god,自定义列就一定不用datasource绑定么?难道兄弟你只用自动生成列榜定?....
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。
都说了,自动显示第一列是GV数据邦定的策略, 而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.
更何况lz的的数据源是datatable,不用绑定自己写循环Rows.Add傻啊?而且速度还慢。
都说了,自动显示第一列是GV数据邦定的策略, 而且也说了,数据邦定之后再隐藏第一列也可以,当然这样实现就比较诡异一点罢了.
#32
实现代码例子:
wjq兄你自己可以跑跑看,看是不是都隐藏掉了
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
你知道不知道VirtualMode方式啊,难道datasource绑定就一定慢?
#34
上面说错了,应该是“难道不用datasource绑定就一定慢”?
#35
我都说了自动显示第一列式DataSource绑定时候干的事了.不否认你一个个加不会触发MatchCurrencyManagerPosition方法.
不是说不用Datasource一定慢,而是很难做到比DataSource快.
同样的效果,如果花大量的时间干ms已经给你实现的功能,那还有什么意义?.NET在于快速开发,ms封了那么多东西,就在于“把开发者从重复性的劳动中解放出来,专注于业务方面的逻辑”。
再总结一下:
1:第一列必定要显示这是DataSource数据绑定的内部逻辑。
2:实在要隐藏第一列,可以在数据绑定后再设置第一列可见=false
3:你一个条条Add当然是可以的,也避免了DataSource时自动设置首列可见,只是貌似没必要去做ms已经实现的功能
以上。如果同意我这3条,当然也没啥好争论的了。
不是说不用Datasource一定慢,而是很难做到比DataSource快.
同样的效果,如果花大量的时间干ms已经给你实现的功能,那还有什么意义?.NET在于快速开发,ms封了那么多东西,就在于“把开发者从重复性的劳动中解放出来,专注于业务方面的逻辑”。
再总结一下:
1:第一列必定要显示这是DataSource数据绑定的内部逻辑。
2:实在要隐藏第一列,可以在数据绑定后再设置第一列可见=false
3:你一个条条Add当然是可以的,也避免了DataSource时自动设置首列可见,只是貌似没必要去做ms已经实现的功能
以上。如果同意我这3条,当然也没啥好争论的了。
#36
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法
前段时间也碰到过类似问题,都反编译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;
dataGridView1.DataSource = dt;
dataGridView1.Columns[0].Visible = fv;
#40
首先非常感谢大家热心的回复我的贴,其次,我再说一下我这个功能的作用和出现的问题:
作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。
问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就是说不管那一列,只要它在第一列的位置就隐藏不了,而其列的位置则可以隐藏。
还请高手能有办法解决我的问题,谢谢!!!
作用:这个功能主要实现对列的隐藏与显示,用户可以自定义显示列,导出成不同文本时则就会显示定义好的显示列,因为有些东西用户可能不需要出现在这个文件中,而有些情况下又想出现。
问题:就如我贴出的代码一样,逻辑和语法上是没有问题,我也进行了跟踪,可是当我设置第一列不显示时,它的visible是false,但是就是隐藏不了,也就是说不管那一列,只要它在第一列的位置就隐藏不了,而其列的位置则可以隐藏。
还请高手能有办法解决我的问题,谢谢!!!
#41
请问有没有能够解决我的问题的方法
#42
路过,学习
#43
应该是个简单的问题,自己复杂化了
#44
高手~~~~~~~~~~~~~~~~~~~~~~~~~~~~,请进!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
#45
lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.
#46
lz你认证看我们的回帖就应该能知道了, 自动显示第一列是在设置DataSource之后,所以你只需要在数据绑定之后,重新设置各个列的可见性就可以了.
我之前就是这样做到的,但还是不行呀!还是会出现的
我之前就是这样做到的,但还是不行呀!还是会出现的
#47
Sure?
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见.....
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?
你可以反编译下DV的代码,会发现,主要就DataSource绑定,行数据刷新的时候会执行MatchCurrencyManagerPosition来设置第一列可见.....
你确定绑定后,你除了设置列的可见性没干别的?比如修改了数据源的值?
#48
你绑定数据源之后
设置 this.dataGridView1.AutoGenerateColumns = false;
再隐藏某一列看行不
不行的话,上网查一查!!
设置 this.dataGridView1.AutoGenerateColumns = false;
再隐藏某一列看行不
不行的话,上网查一查!!
#49
没有,我的代码在最上面,那就是我的现在用的代码了!
#50
如果你在绑定数据源后在进行this.dataGridView1.AutoGenerateColumns = false; 的设置,那么它不会将自动增长列去掉。