首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

datagridview 第一列隐藏不了,该如何处理

2012-05-03 
datagridview 第一列隐藏不了为什么我的datagridview 总是隐藏不了第一列了?我的代码是这样的C# codedgvMe

datagridview 第一列隐藏不了
为什么我的datagridview 总是隐藏不了第一列了?我的代码是这样的

C# code
    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 时,第一列总是出现,也就是不管是哪列,只要它在第一列的位置就不隐藏,请问这是为什么,我都弄了好几天了,找不出原因!!!还请高手帮帮我

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

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


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

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

C# code
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)        {[color=#FF0000]            DataGridViewColumn firstColumn = this.owner.Columns.GetFirstColumn(DataGridViewElementStates.None);            firstColumn.Visible = true;[/color]            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"));            }        }    }}
[解决办法]
探讨
引用:
引用:
所有列都隐藏是不可能的,必定会有一列可见,这是GridView的机制决定的.
前段时间也碰到过类似问题,都反编译gv的代码看过了.所以lz,就放弃所有列都不可见的打算吧
除非继承gv,自己重写相关方法


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

[解决办法]
实现代码例子:
C# code
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", "小王" }); 


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

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

热点排行