C# winform DataGridView 属性说明 - [C# .NET]
2009-08-13 17:33 观海看云 阅读(437) 评论(0) 收藏 举报① 取得或者修改当前单元格的内容 
② 设定单元格只读 
③ 不显示最下面的新行 
④ 判断新增行 
⑤ 行的用户删除操作的自定义 
⑥ 行、列的隐藏和删除 
⑦ 禁止列或者行的Resize 
⑧ 列宽和行高以及列头的高度和行头的宽度的自动调整 
⑨ 冻结列或行 
⑩ 列顺序的调整 
① DataGridView  取得或者修改当前单元格的内容: 
GO TO TOP 
当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取得。如果当前单元格不存在的时候,返回Nothing(C#是null) 
// 取得当前单元格内容 
Console.WriteLine(DataGridView1.CurrentCell.Value); 
// 取得当前单元格的列 Index 
Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); 
// 取得当前单元格的行 Index 
Console.WriteLine(DataGridView1.CurrentCell.RowIndex); 
另外,使用 DataGridView.CurrentCellAddress 属性(而不是直接访问单元格)来确定单元格所在的行:DataGridView.CurrentCellAddress.Y 和列: DataGridView.CurrentCellAddress.X 。这对于避免取消共享行的共享非常有用。 
当前的单元格可以通过设定 DataGridView 对象的 CurrentCell 来改变。可以通过 CurrentCell 来设定 
DataGridView 的激活单元格。将 CurrentCell 设为 Nothing(null) 可以取消激活的单元格。 
// 设定 (0, 0)  为当前单元格 
DataGridView1.CurrentCell = DataGridView1[0, 0]; 
在整行选中模式开启时,你也可以通过 CurrentCell 来设定选定行。 
        /**//// <summary> 
        /// 向下遍历 
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void button4_Click(object sender, EventArgs e) 
        ...{ 
            int row = this.dataGridView1.CurrentRow.Index + 1; 
            if (row > this.dataGridView1.RowCount - 1) 
                row = 0; 
            this.dataGridView1.CurrentCell = this.dataGridView1[0, row];  
        } 
        /**//// <summary> 
        /// 向上遍历 
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void button5_Click(object sender, EventArgs e) 
        ...{ 
            int row = this.dataGridView1.CurrentRow.Index - 1; 
            if (row < 0) 
                row = this.dataGridView1.RowCount - 1; 
            this.dataGridView1.CurrentCell = this.dataGridView1[0, row];  
        } 
* 注意: this.dataGridView 的索引器的参数是: columnIndex, rowIndex 或是 columnName, rowIndex 
这与习惯不同。 
-------------------------------------------------------------------------------- 
② DataGridView  设定单元格只读: 
GO TO TOP 
1) 使用 ReadOnly 属性 
? 如果希望,DataGridView 内所有单元格都不可编辑, 那么只要: 
// 设置 DataGridView1 为只读 
DataGridView1.ReadOnly = true;此时,用户的新增行操作和删除行操作也被屏蔽了。 
? 如果希望,DataGridView 内某个单元格不可编辑, 那么只要: 
// 设置 DataGridView1 的第2列整列单元格为只读 
DataGridView1.Columns[1].ReadOnly = true; 
// 设置 DataGridView1 的第3行整行单元格为只读 
DataGridView1.Rows[2].ReadOnly = true; 
// 设置 DataGridView1 的[0,0]单元格为只读 
DataGridView1[0, 0].ReadOnly = true; 
2) 使用 EditMode 属性 
DataGridView.EditMode 属性被设置为 DataGridViewEditMode.EditProgrammatically 时,用户就不能手动编辑单元格的内容了。但是可以通过程序,调用 DataGridView.BeginEdit 方法,使单元格进入编辑模式进行编辑。 
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; 
3) 根据条件设定单元格的不可编辑状态 
当一个一个的通过单元格坐标设定单元格 ReadOnly 属性的方法太麻烦的时候,你可以通过 CellBeginEdit 事件来取消单元格的编辑。 
// CellBeginEdit 事件处理方法 
private void DataGridView1_CellBeginEdit(object sender, 
    DataGridViewCellCancelEventArgs e) 
{ 
    DataGridView dgv = (DataGridView)sender; 
    //是否可以进行编辑的条件检查 
    if (dgv.Columns[e.ColumnIndex].Name == "Column1" && 
        !(bool)dgv["Column2", e.RowIndex].Value) 
    { 
        // 取消编辑 
        e.Cancel = true; 
    } 
} 
-------------------------------------------------------------------------------- 
③ DataGridView  不显示最下面的新行: 
GO TO TOP 
通常 DataGridView 的最下面一行是用户新追加的行(行头显示 * )。如果不想让用户新追加行即不想显示该新行,可以将 DataGridView 对象的 AllowUserToAddRows 属性设置为 False。 
// 设置用户不能手动给 DataGridView1 添加新行 
DataGridView1.AllowUserToAddRows = false; 
但是,可以通过程序: DataGridViewRowCollection.Add 为 DataGridView 追加新行。 
补足: 如果 DataGridView 的 DataSource 绑定的是 DataView, 还可以通过设置 DataView.AllowAdd 
属性为 False 来达到同样的效果。 
-------------------------------------------------------------------------------- 
④ DataGridView  判断新增行: 
GO TO TOP 
DataGridView 的AllowUserToAddRows属性为True时也就是允许用户追加新行的场合下,DataGridView的最后一行就是新追加的行(*行)。使用 DataGridViewRow.IsNewRow 属性可以判断哪一行是新追加的行。另外,通过DataGridView.NewRowIndex 可以获取新行的行序列号。在没有新行的时候,NewRowIndex = -1。 
-------------------------------------------------------------------------------- 
⑤ DataGridView  行的用户删除操作的自定义: 
GO TO TOP 
1) 无条件的限制行删除操作。 
默认时,DataGridView 是允许用户进行行的删除操作的。如果设置 DataGridView对象的AllowUserToDeleteRows属性为 False 时, 用户的行删除操作就被禁止了。 
// 禁止DataGridView1的行删除操作。 
DataGridView1.AllowUserToDeleteRows = false; 
但是,通过 DataGridViewRowCollection.Remove 还是可以进行行的删除。 
补足: 如果 DataGridView 绑定的是 DataView 的话,通过 DataView.AllowDelete 也可以控制行的删除。 
2) 行删除时的条件判断处理。 
用户在删除行的时候,将会引发 DataGridView.UserDeletingRow 事件。 在这个事件里,可以判断条件并取消删除操作。 
// DataGridView1 的 UserDeletingRow 事件 
private void DataGridView1_UserDeletingRow( 
    object sender, DataGridViewRowCancelEventArgs e) 
{ 
    // 删除前的用户确认。 
    if (MessageBox.Show("确认要删除该行数据吗?", "删除确认", 
        MessageBoxButtons.OKCancel, 
        MessageBoxIcon.Question) != DialogResult.OK) 
    { 
        // 如果不是 OK,则取消。 
        e.Cancel = true; 
    } 
} 
-------------------------------------------------------------------------------- 
⑥ DataGridView  行、列的隐藏和删除: 
GO TO TOP 
1) 行、列的隐藏 
// DataGridView1的第一列隐藏 
DataGridView1.Columns[0].Visible = false; 
// DataGridView1的第一行隐藏 
DataGridView1.Rows[0].Visible = false; 
2) 行头、列头的隐藏 
// 列头隐藏 
DataGridView1.ColumnHeadersVisible = false; 
// 行头隐藏 
DataGridView1.RowHeadersVisible = false; 
3) 行和列的删除 
' 删除名为"Column1"的列 
DataGridView1.Columns.Remove("Column1"); 
' 删除第一列 
DataGridView1.Columns.RemoveAt(0); 
' 删除第一行 
DataGridView1.Rows.RemoveAt(0); 
4) 删除选中行 
foreach (DataGridViewRow r in DataGridView1.SelectedRows) 
{ 
    if (!r.IsNewRow) 
    { 
        DataGridView1.Rows.Remove(r); 
    } 
} 
-------------------------------------------------------------------------------- 
⑦ DataGridView 禁止列或者行的Resize: 
GO TO TOP 
1) 禁止所有的列或者行的Resize 
// 禁止用户改变DataGridView1的所有列的列宽 
DataGridView1.AllowUserToResizeColumns = false; 
//禁止用户改变DataGridView1の所有行的行高 
DataGridView1.AllowUserToResizeRows = false; 
但是可以通过 DataGridViewColumn.Width 或者 DataGridViewRow.Height 属性设定列宽和行高。 
2) 禁止指定行或者列的Resize 
// 禁止用户改变DataGridView1的第一列的列宽 
DataGridView1.Columns[0].Resizable = DataGridViewTriState.False; 
// 禁止用户改变DataGridView1的第一列的行宽 
DataGridView1.Rows[0].Resizable = DataGridViewTriState.False; 
? 关于 NoSet 
当 Resizable 属性设为 DataGridViewTriState.NotSet 时, 实际上会默认以 DataGridView 的 AllowUserToResizeColumns 和  AllowUserToResizeRows 的属性值进行设定。比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 设定时,Resizable = False 。 
判断 Resizable 是否是继承设定了 DataGridView 的 AllowUserToResizeColumns 和  AllowUserToResizeRows 的属性值, 可以根据 State 属性判断。如果 State 属性含有 ResizableSet,那么说明没有继承设定。 
3) 列宽和行高的最小值的设定 
// 第一列的最小列宽设定为 100 
DataGridView1.Columns[0].MinimumWidth = 100; 
// 第一行的最小行高设定为 50 
DataGridView1.Rows[0].MinimumHeight = 50; 
4) 禁止用户改变行头的宽度以及列头的高度 
// 禁止用户改变列头的高度 
DataGridView1.ColumnHeadersHeightSizeMode = 
    DataGridViewColumnHeadersHeightSizeMode.DisableResizing; 
// 禁止用户改变行头的宽度 
DataGridView1.RowHeadersWidthSizeMode = 
    DataGridViewRowHeadersWidthSizeMode.EnableResizing; 
-------------------------------------------------------------------------------- 
⑧ DataGridView 列宽和行高自动调整的设定: 
GO TO TOP 
1) 设定行高和列宽自动调整 
// 设定包括Header和所有单元格的列宽自动调整 
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 
// 设定包括Header和所有单元格的行高自动调整 
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; 
AutoSizeColumnsMode 属性的设定值枚举请参照 msdn 的 DataGridViewAutoSizeRowsMode 说明。 
2)指定列或行自动调整 
// 第一列自动调整 
DataGridView1.Columns[0].AutoSizeMode = 
    DataGridViewAutoSizeColumnMode.DisplayedCells; 
AutoSizeMode 设定为 NotSet  时, 默认继承的是  DataGridView.AutoSizeColumnsMode 属性。 
3) 设定列头的高度和行头的宽度自动调整 
// 设定列头的宽度可以自由调整 
DataGridView1.ColumnHeadersHeightSizeMode = 
    DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
// 设定行头的宽度可以自由调整 
DataGridView1.RowHeadersWidthSizeMode = 
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders; 
4) 随时自动调整 
a, 临时的,让列宽自动调整,这和指定AutoSizeColumnsMode属性一样。 
// 让 DataGridView1 的所有列宽自动调整一下。 
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); 
// 让 DataGridView1 的第一列的列宽自动调整一下。 
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells);上面调用的 AutoResizeColumns 和 AutoResizeColumn 当指定的是DataGridViewAutoSizeColumnMode.AllCells 的时候,参数可以省略。即: 
DataGridView1.AutoResizeColumn(0) 和 DataGridView1.AutoResizeColumns() 
b,临时的,让行高自动调整 
// 让 DataGridView1 的所有行高自动调整一下。 
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells); 
//让 DataGridView1 的第一行的行高自动调整一下。 
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);上面调用的 AutoResizeRows 和 AutoResizeRow 当指定的是DataGridViewAutoSizeRowMode.AllCells 的时候,参数可以省略。即:DataGridView1.AutoResizeRow (0) 和 DataGridView1.AutoResizeRows() 
c,临时的,让行头和列头自动调整
// 列头高度自动调整 
DataGridView1.AutoResizeColumnHeadersHeight(); 
// 行头宽度自动调整 
DataGridView1.AutoResizeRowHeadersWidth( 
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 
关于性能: 
通过 AutoSizeColumnsMode 或者 AutoSizeRowsMode 属性所指定的单元格进行自动调整时,如果调整次数过于多那么将可能导致性能下降,尤其是在行和列数比较多的情况下。在这时用 DisplayedCells 代替 AllCells 能减少非所见的单元格的调整,从而提高性能。 
-------------------------------------------------------------------------------- 
⑨ DataGridView 冻结列或行 
1) 列冻结 
DataGridViewColumn.Frozen 属性为 True 时, 该列左侧的所有列被固定, 横向滚动时固定列不随滚动条滚动而左右移动。这对于重要列固定显示很有用。 
// DataGridView1的左侧2列固定 
DataGridView1.Columns[1].Frozen = true; 
但是,DataGridView.AllowUserToOrderColumns = True 时,固定列不能移动到非固定列, 反之亦然。 
2) 行冻结 
DataGridViewRow.Frozen 属性为 True 时, 该行上面的所有行被固定, 纵向滚动时固定行不随滚动条滚动而上下移动。 
// DataGridView1 的上3行固定 
DataGridView1.Rows[2].Frozen = true; 
-------------------------------------------------------------------------------- 
⑩ DataGridView 列顺序的调整 
GO TO TOP 
设定 DataGridView 的 AllowUserToOrderColumns 为 True 的时候, 用户可以自由调整列的顺序。 
当用户改变列的顺序的时候,其本身的 Index 不会改变,但是 DisplayIndex 改变了。你也可以通过程序改变 DisplayIndex 来改变列的顺序。 列顺序发生改变时会引发 ColumnDisplayIndexChanged 事件: 
// DataGridView1的ColumnDisplayIndexChanged事件处理方法 
private void DataGridView1_ColumnDisplayIndexChanged(object sender, 
    DataGridViewColumnEventArgs e) 
{ 
    Console.WriteLine("{0} 的位置改变到 {1} ", 
        e.Column.Name, e.Column.DisplayIndex); 
} 
出处:http://www.cnblogs.com/zhangtao/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号