2012-05-23 65 views
0

我有一个DataGridView一个ComboBoxColumn。当我单击它,然后移动到同一列中的下一行或前一行,我得到一个Exception(和我的应用程序崩溃)。GridViewComboBoxColumns得到的NullReferenceException

这里是我的代码,我该如何解决这个问题?

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(); 
    } 
} 
+3

你得到了什么异常,以及在哪一行? – Bridge

回答

1

这个问题问得不好,不太可能为您解答您的问题。请阅读http://tinyurl.com/so-hints以了解如何提出编码问题的一般准则。你对这个问题所做的工作越多,回答你的问题的回答者就越多。随着迄今所提供的信息量,最好我们可以给你的是,异常可能是因为你使用的.操作上具有空值的变量。有用的权利;-)

这就是说,你可以采取几个其他的步骤来清理你的代码。我们先从第一次尝试抓住开始。您在许多地方包括dgv_Panchang,包括您的finally块。你确定dgv_Panchang永远不会为空吗?如果它为空,则可以获得NullReferenceException。此外,它看起来像你的两个catch块做同样的事情。你也许可以取下内部的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.NameCls_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 (dgv_Panchang.CurrentCell.ColumnIndex == 1 || dgv_Panchang.CurrentCell.ColumnIndex == 4)

缩短LOC计数像这是一件好事。

还有一个批评:我希望你的comboBox不允许原始的用户输入,以免他输入像"';DROP TABLE tbl_specialday;--"或更糟糕的东西,并毁了你的一天。查看SQL参数以使代码更健壮。

相关问题