use*_*861 3 c# sorting null datetime datagridview
我有一个带有 DateTime 值列的 datagridview,其中一些为空。在我尝试按该列排序之前没有问题。我已经实现了此处找到的 SortCompare 代码
DataGridView 在 DateTime 列中使用空值进行排序
但调试器仍在抛出异常并指向我的 Application.Run(new MainForm());
行,说
Object must be of type DateTime.
Run Code Online (Sandbox Code Playgroud)
try-catch我的 SortCompare 事件处理程序中有一个,并且我能够成功地单步执行所有代码。只有当事件处理程序返回时才会抛出异常。
我怎样才能防止这个异常?
代码:
在 Visual Studio 中打开一个新的 c# windows 窗体项目,并使用Fulldockstyle在窗体上抛出一个 datagridview 。在Form1.cs替换public Form1()为以下代码方法:
public Form1()
{
InitializeComponent();
//Create datatable and add a datetime column
DataTable dTable = new DataTable();
DataColumn dColumn = new DataColumn("DateTimes", typeof(DateTime));
dTable.Columns.Add(dColumn);
//Add rows
dTable.Rows.Add(DateTime.Now);
dTable.Rows.Add(DBNull.Value);
//Create a datagridview column and add it to the datagridview
DataGridViewTextBoxColumn dgvColumn = new DataGridViewTextBoxColumn();
dgvColumn.Name = dColumn.ColumnName;
dgvColumn.ValueType = dColumn.DataType;
this.dataGridView1.Columns.Add(dgvColumn);
//Add rows to the datagridview based on datatable data.
foreach (DataRow dRow in dTable.Rows)
{
DataGridViewRow dgvRow = new DataGridViewRow();
dgvRow.CreateCells(this.dataGridView1);
dgvRow.SetValues(dRow.ItemArray);
this.dataGridView1.Rows.Add(dgvRow);
}
//Hook up sortcompare event handler
this.dataGridView1.SortCompare += new DataGridViewSortCompareEventHandler(dataGridView1_SortCompare);
//Style datagridview
this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
try
{
if (DBNull.Value.Equals(e.CellValue1) || DBNull.Value.Equals(e.CellValue2))
{
if (DBNull.Value.Equals(e.CellValue1) || e.CellValue1.Equals(null))
{
e.SortResult = 1;
}
else if (DBNull.Value.Equals(e.CellValue2) || e.CellValue2.Equals(null))
{
e.SortResult = -1;
}
}
else
{
e.SortResult = (e.CellValue1 as IComparable).CompareTo(e.CellValue2 as IComparable);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行程序并尝试对列进行排序以抛出异常。
小智 5
你缺少 e.Handled = true; 将其设置为 true 将解决您的问题。
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
try
{
if (DBNull.Value.Equals(e.CellValue1) || DBNull.Value.Equals(e.CellValue2))
{
if (DBNull.Value.Equals(e.CellValue1) || e.CellValue1.Equals(null))
{
e.SortResult = 1;
}
else if (DBNull.Value.Equals(e.CellValue2) || e.CellValue2.Equals(null))
{
e.SortResult = -1;
}
}
else
{
e.SortResult = (e.CellValue1 as IComparable).CompareTo(e.CellValue2 as IComparable);
}
e.Handled = true
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1766 次 |
| 最近记录: |