GridViewComboBoxColumns get NullReferenceException
本文关键字:NullReferenceException get GridViewComboBoxColumns | 更新日期: 2023-09-27 18:35:10
我在DataGridView
里有一个ComboBoxColumn
。当我单击它,然后移动到同一列中的下一行或上一行时,我得到了一个Exception
(并且我的应用程序崩溃了)。
这是我的代码,我该如何解决这个问题?
private void cmbBox_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
// dgv_Panchang.EndEdit();
string SpID = string.Empty;
//ComboBox cmbBox = (ComboBox)sender;
ComboBox cmbBox = new ComboBox();
cmbBox = (ComboBox)sender;
if (cmbBox != null)
{
if (dgv_Panchang.CurrentCell.ColumnIndex == 1)
{
Cls_Global_Var.Name = string.Empty;
Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
if (Cls_Global_Var.Name != string.Empty)
{
Cls_Global_Var.StrSql = string.Empty;
Cls_Global_Var.StrSql = "select Pk_SpecialDay from tbl_specialday where V_Title ='" + Cls_Global_Var.Name + "'";
SpID = Cls_DataBase.GetIdentCurrentID(Cls_Global_Var.StrSql);
if (SpID != null)
{
int RowIndex = dgv_Panchang.CurrentCell.RowIndex;
int ColIndex = dgv_Panchang.CurrentCell.ColumnIndex;
DataGridViewCell dgvCurrent = dgv_Panchang[ColIndex + 2, RowIndex];
if (dgvCurrent != null)
{
dgv_Panchang.CurrentCell = dgvCurrent;
dgv_Panchang.CurrentRow.Cells["SPDValue"].Value = SpID;
Cls_PanchangMaster_Obj.GetSpecialDayName(Convert.ToInt32(SpID), ColIndex, dgv_Panchang);
}
}
}
else
{
return;
}
}
else if (dgv_Panchang.CurrentCell.ColumnIndex == 4)
{
try
{
Cls_Global_Var.Name = string.Empty;
Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
if (Cls_Global_Var.Name != string.Empty && Cls_Global_Var.Name != null)
{
Cls_Global_Var.StrSql = string.Empty;
Cls_Global_Var.StrSql = "select Pk_SpecialDay from tbl_specialday where V_Title ='" + Cls_Global_Var.Name + "'";
SpID = Cls_DataBase.GetIdentCurrentID(Cls_Global_Var.StrSql);
if (SpID != null)
{
int RowIndex = dgv_Panchang.CurrentCell.RowIndex;
int ColIndex = dgv_Panchang.CurrentCell.ColumnIndex;
DataGridViewCell dgvCurrent = dgv_Panchang[ColIndex + 2, RowIndex];
if (dgvCurrent != null)
{
dgv_Panchang.CurrentCell = dgvCurrent;
dgv_Panchang.CurrentRow.Cells["SPDValue"].Value = SpID;
Cls_PanchangMaster_Obj.GetSpecialDayName(Convert.ToInt32(SpID), ColIndex, dgv_Panchang);
}
}
}
}
catch (Exception ex)
{
Cls_GlobalMessage.CreatErrorLog(ex.Message.ToString());
}
}
}
}
catch (Exception ex)
{
Cls_GlobalMessage.CreatErrorLog(ex.Message.ToString());
}
finally
{
dgv_Panchang.ClearSelection();
dgv_Panchang.EndEdit();
}
}
这个问题问得很差,不太可能给你带来解决你的问题的回答。 请阅读 http://tinyurl.com/so-hints,了解如何提出编码问题的一般指南。 你在问题中投入的工作越多,回答者在回答你的问题时可能投入的工作就越多。 根据到目前为止提供的信息量,我们能为您提供的最好的信息是,异常可能是因为您在具有 null 值的变量上使用 .
运算符。有用的权利;-)
话虽如此,您还可以采取其他几个步骤来清理代码。 让我们从第一次尝试捕获开始。 您在许多地方取消引用dgv_Panchang
,包括您的最终块。 您确定dgv_Panchang
永远不会为空吗? 如果它为 null,则可以得到一个NullReferenceException
。 此外,看起来您的两个捕获块都做同样的事情。 您可能可以在不更改代码的任何语义的情况下删除内部 try-catch(堆栈跟踪可能具有不同的行号以用于捕获的异常)
继续前进。 在许多地方,您将变量设置为新对象,然后立即将其设置为其他对象:即
ComboBox cmbBox = new ComboBox();
cmbBox = (ComboBox)sender;
Cls_Global_Var.Name = string.Empty;
Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
Cls_Global_Var.StrSql = string.Empty;
Cls_Global_Var.StrSql = "select Pk_SpecialDay from tbl_specialday where V_Title ='" + Cls_Global_Var.Name + "'";
在所有这些实例中,都可以删除第一行以节省时间和内存。 这并没有错,而只是一个代码审查建议。
您似乎正在使用一些静态全局类来存储信息,例如Cls_Global_Var.Name
或Cls_Global_Var.StrSql
。 可能有更好的方法可以在没有静态的情况下处理这个问题,如果你还必须小心多线程问题(如果适用),但这是一个太大的问题,需要比你在这里讨论的更多的上下文。
何时dgv_Panchang.CurrentCell.ColumnIndex == 1
和何时4
的代码非常相似。 除了后面的额外 try-catch,正如我之前提到的,可能不需要,唯一的区别是 if 语句中的额外子句:
Cls_Global_Var.Name = cmbBox.SelectedItem.ToString();
if (Cls_Global_Var.Name != string.Empty && Cls_Global_Var.Name != null)
由于.ToString()
永远不会返回 null,因此不需要该&& Cls_Global_Var.Name != null
,可以将其删除。(作为旁注,请查看string.IsNullOrEmpty()
)
删除它后,两个代码块是相同的,这意味着您可以使用以下内容压缩if语句:
if (dgv_Panchang.CurrentCell.ColumnIndex == 1 || dgv_Panchang.CurrentCell.ColumnIndex == 4)
像这样缩短LOC计数是一件好事。
还有一个批评:我希望你的组合框不允许原始用户输入,以免他输入类似"';DROP TABLE tbl_specialday;--"
或更糟的东西并毁了你的一天。 查看 SQL 参数以使代码更加健壮。