★ DataGridView    取得或者修改当前单元格的内容:

GO TO TOP

当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取得。如果当前单元格不存在的时候,返回Nothing(C#是null)
[VB.NET]
' 取得当前单元格内容
Console.WriteLine(DataGridView1.CurrentCell.Value)
' 取得当前单元格的列 Index
Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex)
' 取得当前单元格的行 Index
Console.WriteLine(DataGridView1.CurrentCell.RowIndex)

[C#]
// 取得当前单元格内容
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) 可以取消激活的单元格。

[VB.NET]
' 设定 (0, 0)    为当前单元格
DataGridView1.CurrentCell = DataGridView1(0, 0)

[C#]
// 设定 (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 属性
&S658; 如果希望,DataGridView 内所有单元格都不可编辑, 那么只要:
[VB.NET]
' 设置 DataGridView1 为
DataGridView1.ReadOnly = True
[C#]
// 设置 DataGridView1 为
DataGridView1.ReadOnly = true;此时,用户的新增行操作和删除行操作也被屏蔽了。

&S658; 如果希望,DataGridView个单元格不可编辑, 那么只要:
[VB.NET]
' 设置 DataGridView1 的第2列整列单元格为
DataGridView1.Columns(1).ReadOnly = True

' 设置 DataGridView1 的第3行整行单元格为
DataGridView1.Rows(2).ReadOnly = True

' 设置 DataGridView1 的[0,0]单元格为
DataGridView1(0, 0).ReadOnly = True
[C#]
// 设置 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 方法,使单元格进入编辑模式进行编辑
[VB.NET]
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically
[C#]
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
3) 根据条件设定单元格的不可编辑状态
当一个一个的通过单元格坐标设定单元格 ReadOnly 属性的方法太麻烦的时候,你可以通过 CellBeginEdit 事件来取消单元格的编辑
[VB.NET]
'CellBeginEdit 事件处理方法
Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, _
          ByVal e As DataGridViewCellCancelEventArgs) _
          Handles DataGridView1.CellBeginEdit
      Dim dgv As DataGridView = CType(sender, DataGridView)
      ' 是否可以进行编辑的条件检查
      If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _
          Not CBool(dgv("Column2", e.RowIndex).Value) Then
          ' 取消编辑
          e.Cancel = True
      End If
End Sub
[C#]
// 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。
[VB.NET]
' 设置用户不能手动给 DataGridView1 添加新行
DataGridView1.AllowUserToAddRows = False
[C#]
// 设置用户不能手动给 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。[VB.NET]
If DataGridView1.CurrentRow.IsNewRow Then
      Console.WriteLine("当前行为新追加行。")
Else
      Console.WriteLine("当前行不是新追加行。")
End If

--------------------------------------------------------------------------------
★ DataGridView    行的用户删除操作的自定义:

GO TO TOP

1) 无条件的限制行删除操作。
默认时,DataGridView允许用户进行行的删除操作的。如果设置 DataGridView对象的AllowUserToDeleteRows属性为 False 时, 用户的行删除操作就被禁止了。
[VB.NET]
' 禁止DataGridView1的行删除操作。
DataGridView1.AllowUserToDeleteRows = False
[C#]
// 禁止DataGridView1的行删除操作。
DataGridView1.AllowUserToDeleteRows = false;
但是,通过 DataGridViewRowCollection.Remove 还是可以进行行的删除。
补足: 如果 DataGridView 绑定的是 DataView 的话,通过 DataView.AllowDelete 也可以控制行的删除。

2) 行删除时的条件判断处理。
用户在删除行的时候,将会引发 DataGridView.UserDeletingRow 事件。 在这个事件里,可以判断条件并取消删除操作。

[C#]
// 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) 行、列的隐藏
[VB.NET]
' DataGridView1的第一列隐藏
DataGridView1.Columns(0).Visible = False
' DataGridView1的第一行隐藏
DataGridView1.Rows(0).Visible = False
[C#]
// DataGridView1的第一列隐藏
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隐藏
DataGridView1.Rows[0].Visible = false;
2) 行头、列头的隐藏
[VB.NET]
' 列头隐藏
DataGridView1.ColumnHeadersVisible = False
' 行头隐藏
DataGridView1.RowHeadersVisible = False
[C#]
// 列头隐藏
DataGridView1.ColumnHeadersVisible = false;
// 行头隐藏
DataGridView1.RowHeadersVisible = false;
3) 行和列的删除
[VB.NET]
' 删除名为"Column1"的列
DataGridView1.Columns.Remove("Column1")
' 删除第一列
DataGridView1.Columns.RemoveAt(0)
' 删除第一行
DataGridView1.Rows.RemoveAt(0)

[C#]
' 删除名为"Column1"的列
DataGridView1.Columns.Remove("Column1");
' 删除第一列
DataGridView1.Columns.RemoveAt(0);
' 删除第一行
DataGridView1.Rows.RemoveAt(0);
4) 删除选中行
[VB.NET]
For Each r As DataGridViewRow In DataGridView1.SelectedRows
      If Not r.IsNewRow Then
          DataGridView1.Rows.Remove(r)
      End If
Next
[C#]
foreach (DataGridViewRow r in DataGridView1.SelectedRows)
{
      if (!r.IsNewRow)
      {
          DataGridView1.Rows.Remove(r);
      }
}

--------------------------------------------------------------------------------
DataGridView 禁止列或者行的Resize:

GO TO TOP

1) 禁止所有的列或者行的Resize
[VB.NET]
' 禁止用户改变DataGridView1的所有列的列宽
DataGridView1.AllowUserToResizeColumns = False

'禁止用户改变DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = False
[C#]
// 禁止用户改变DataGridView1的所有列的列宽
DataGridView1.AllowUserToResizeColumns = false;

//禁止用户改变DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = false;
但是可以通过 DataGridViewColumn.Width 或者 DataGridViewRow.Height 属性设定列宽和行高。

2) 禁止指定行或者列的Resize
[VB.NET]
'    禁止用户改变DataGridView1的第一列的列宽
DataGridView1.Columns(0).Resizable = DataGridViewTriState.False

'    禁止用户改变DataGridView1的第一列的行宽
DataGridView1.Rows(0).Resizable = DataGridViewTriState.False
[C#]
// 禁止用户改变DataGridView1的第一列的列宽
DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;

// 禁止用户改变DataGridView1的第一列的行宽
DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;
&S658; 关于 NoSet

当 Resizable 属性设为 DataGridViewTriState.NotSet 时, 实际上会默认以 DataGridView 的 AllowUserToResizeColumns 和    AllowUserToResizeRows 的属性值进行设定。比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 设定时,Resizable = False 。


判断 Resizable 是否是继承设定了 DataGridView 的 AllowUserToResizeColumns 和    AllowUserToResizeRows 的属性值, 可以根据 State 属性判断。如果 State 属性含有 ResizableSet,那么说明没有继承设定。


3) 列宽和行高的最小值的设定
[VB.NET]
' 第一列的最小列宽设定为 100
DataGridView1.Columns(0).MinimumWidth = 100

' 第一行的最小行高设定为 50
DataGridView1.Rows(0).MinimumHeight = 50
[C#]
// 第一列的最小列宽设定为 100
DataGridView1.Columns[0].MinimumWidth = 100;

// 第一行的最小行高设定为 50
DataGridView1.Rows[0].MinimumHeight = 50;
4) 禁止用户改变行头的宽度以及列头的高度
[VB.NET]
'    禁止用户改变列头的高度
DataGridView1.ColumnHeadersHeightSizeMode = _
      DataGridViewColumnHeadersHeightSizeMode.DisableResizing

' 禁止用户改变行头的宽度
DataGridView1.RowHeadersWidthSizeMode = _
      DataGridViewRowHeadersWidthSizeMode.EnableResizing
[C#]
// 禁止用户改变列头的高度
DataGridView1.ColumnHeadersHeightSizeMode =
      DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

// 禁止用户改变行头的宽度
DataGridView1.RowHeadersWidthSizeMode =
      DataGridViewRowHeadersWidthSizeMode.EnableResizing;


--------------------------------------------------------------------------------
DataGridView 列宽和行高自动调整的设定:
GO TO TOP

1) 设定可以自由调整行高和列宽
[VB.NET]
' 设定包括Header和所有单元格的列宽可以自由调整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

' 设定包括Header和所有单元格的行高可以自由调整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
[C#]
// 设定包括Header和所有单元格的列宽可以自由调整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

// 设定包括Header和所有单元格的行高可以自由调整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
AutoSizeColumnsMode 属性的设定值枚举请参照 msdn 的 DataGridViewAutoSizeRowsMode 说明。

2) 设定可以自由调整行头的高度和列头的宽度
[VB.NET]
'    设定列头的宽度可以自由调整
DataGridView1.ColumnHeadersHeightSizeMode = _
      DataGridViewColumnHeadersHeightSizeMode.AutoSize

'    设定行头的宽度可以自由调整
DataGridView1.RowHeadersWidthSizeMode = _
      DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
[C#]
// 设定列头的宽度可以自由调整
DataGridView1.ColumnHeadersHeightSizeMode =
      DataGridViewColumnHeadersHeightSizeMode.AutoSize;

// 设定行头的宽度可以自由调整
DataGridView1.RowHeadersWidthSizeMode =
      DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;

]]>2007-09-30 15:12:00.0http://onedrm.blogcn.com/diary,10880633.shtmlhttp://onedrm.blogcn.com/diary,10880633.shtml#commenthttp://onedrm.blogcn.com/diary,10803328.shtml使用 Windows Form 按列排序 ListView 项目
Shannon Dunn
Microsoft Corporation

Applies to:
Microsoft® .NET Framework
Microsoft® Visual Studio® .NET

摘要: 说明如何根据所单击的列在 Microsoft .NET 中的 ListView 控件提供项目排序。

*
本页内容
简介 简介
ListView 控件的自定义排序功能 ListView 控件的自定义排序功能
升序排序 升序排序
升序或降序排序 升序或降序排序
排序日期 排序日期
小结 小结

 

ListView 控件是显示文件系统信息和显示 XML 或数据库数据的非常好的方式。ListView 控件通常用于显示表示项目以及项目文本的图形图标。此外,ListView 控件还可以用于显示有关子项目中项目的其他信息。例如,如果 ListView 控件显示一列文件,您可以配置 ListView 控件来显示作为子项目的诸如文件大小和属性的详细信息。要显示 ListView 控件中的子项目信息,必须将 View 属性设置为 View.Details。此外,您必须创建 ColumnHeader 对象并将这些对象分配给 ListView 控件的 Columns 属性。在设置这些属性后,项目以行和列格式进行显示,类似于 DataGrid 控件。以这种方式显示项目的能力使 ListView 控件为从任意类型的数据源显示数据提供了快速、简便的解决方案。

ListView 控件进行排序是通过使用 ListViewSorting 属性而提供的。这使您可以定义要应用到项目的排序类型。如果您想按项目排序,这是一个非常好的功能。如果您要按子项目排序,必须使用 ListView 控件的自定义排序功能。本文将说明如何在 ListView 控件中执行自定义排序,以及在排序时如何处理特殊的数据类型条件。

ListView 控件的自定义排序功能

ListView 控件提供了您可以使用排序的功能,而不是由 Sorting 属性提供。当 ListView 控件使用 Sorting 属性排序项目时,它使用一个实现 System.Collections.IComparer 接口的类。这个类提供用于排序每个项目的排序功能。为了按子项目进行排序,您必须创建自己的类,来实现反过来可以实现 ListView 控件所需排序的 IComparer 接口。该类利用构造函数进行定义,该构造函数可以指定 ListView 控件排序所用的列。在您创建这个类后(通常将其作为窗体的嵌套类),您可以创建该类的一个实例,并将其分配到 ListViewListViewItemSorter 属性。当调用 Sort 方法时,这会确定 ListView 控件将要使用的自定义排序类。Sort 方法执行 ListView 项目的实际排序。

升序排序

以下部分提供的基本示例说明了在 ListView 控件中基于其子项目的排序。该示例说明了以升序排序 ListView 控件中的项目。升序排序或降序排序将会在本文的稍后部分进行说明。此处的目标就是说明在 ListView 控件中进行自定义排序的基本要求。

初始化控件

如果要开始,请创建 ListView 控件的实例,并将其添加到窗体中。在控件位于窗体上后,使用 Items 属性将项目添加到 ListView 控件。您可以添加任意多的项目,只要确保每个项目的文本都是唯一的。在您创建项目时,为每个项目添加两个子项目。第一个子项目应该包含数字信息,第二个子项目包含日期信息。下面的表格示例说明该信息在 ListView 控件中可能如何显示。

项目 子项目 1 子项目 2

Alpha

1.0

4/5/1945

Charlie

3.5

1/9/1920

Bravo

2.4

12/8/1930

创建两个 ColumnHeader 对象,并将它们分配到 ListView 控件的 Columns 属性中。将 View 属性设置为 View.Details

处理 ColumnClick 事件

为了确定按哪个子项目集进行排序,您需要了解用户何时单击个子项目的列标题。为此,您需要为 ListViewColumnClick 事件创建一个事件处理方法。将事件处理方法作为窗体中的一个成员,并确保它包含的签名相似于下面代码示例所显示的签名。

'Visual Basic 
Private Sub listView1_ColumnClick(sender As Object, e As System.Windows.Forms.ColumnClickEventArgs)
End Sub
//C#
private void listView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
}

通过向窗体的构造函数中添加代码,将事件处理方法连接到 ListView 控件,如下面的示例所示。

'Visual Basic
AddHandler listView1.ColumnClick, AddressOf Me.listView1_ColumnClick
//C#
this.listView1.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listView1_ColumnClick);

将下面的代码添加到用于 ColumnClick 事件的事件处理方法。

'Visual Basic 
' Set the ListViewItemSorter property to a new ListViewItemComparer
' object.
Me.listView1.ListViewItemSorter = New ListViewItemComparer(e.Column)
' Call the sort method to manually sort.
listView1.Sort()
//C#
// Set the ListViewItemSorter property to a new ListViewItemComparer
// object.
this.listView1.ListViewItemSorter = new ListViewItemComparer(e.Column);
// Call the sort method to manually sort.
listView1.Sort();