datagridview 第一列隐藏不了
为什么我的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);
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")); } } }}
[解决办法]
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条,当然也没啥好争论的了。