0

我有ComboBoxColumn一个DataGridView。当我单击它时,然后移动到同一列中的下一行或上一行,我得到一个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();
    }
}
4

1 回答 1

1

这个问题问得不好,不太可能给你带来可以解决你问题的回答。请阅读http://tinyurl.com/so-hints了解如何提出编码问题的一般指南。您在问题中投入的工作越多,回答者可能会投入更多的工作来回答您的问题。根据迄今为止提供的大量信息,我们可以为您提供的最好的信息是异常可能是因为您在.具有空值的变量上使用了运算符。有用的权利;-)

话虽如此,您还可以采取其他几个步骤来稍微清理一下您的代码。让我们从第一次 try catch 开始。您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 语句:

if (dgv_Panchang.CurrentCell.ColumnIndex == 1 || dgv_Panchang.CurrentCell.ColumnIndex == 4)

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

另一个批评:我希望您的组合框不允许原始用户输入,以免他输入类似"';DROP TABLE tbl_specialday;--"或更糟的内容并破坏您的一天。查看 SQL 参数以使您的代码更健壮。

于 2012-05-23T17:41:26.790 回答