NullReferenceException未处理,我不知道为什么?

时间:2013-01-10 16:33:48

标签: c# wpf datagrid nullreferenceexception

我正在创建一个WPF C#应用程序,它将数据网格连接到SQL Server数据库。用户可以选择在数据网格中编辑数据,方法是突出显示一行并单击编辑按钮,然后使用突出显示的行中的数据填充多个文本框。此时,用户可以编辑数据,单击“保存”,数据网格将反映更改。直到最近,该功能工作正常。但是,我被要求添加一个功能,在屏幕上的其他位置显示突出显示的数据行(因为查看数据网格太长时间会变得无聊)。因此,当用户点击一行时,数据网格右侧的一系列文本块会更改,以便以更易于查看的格式显示突出显示的行的数据。该功能也很好。我现在遇到的问题是,当突出显示一行并自动显示文本块中的数据时,如果用户也尝试编辑该行,则应用程序崩溃。用户单击编辑后,文本框中的数据显示正常(同时在文本块中显示相同的突出显示的行);只是在点击保存时我遇到了问题。

调试程序显示一切运行顺利。但是在单击save之后,调试器会跳回到myGridSelectionChanged事件并说“NullReferenceException未处理 - 对象引用未设置为对象的实例”但是当我重新加载程序时,datagrid会反映我之前尝试进行的更改应用程序崩溃了。我假设这意味着问题与实际编辑数据库没有关系,而问题是文本块无法反映这些编辑。以下是我的一些代码:

以下是保存按钮的代码:

     private void saveBtn_Click(object sender, RoutedEventArgs e)
    {
        var stqmDC = new SqtmLinqDataContext();

        var selectedRow = EditGrid.GetSelectedRow(myGrid);
        var ID = EditGrid.GetCell(myGrid, selectedRow, 0);
        string selectedID = ((TextBlock)ID.Content).Text;
        int convertedID = Convert.ToInt32(selectedID);

        int newQuantity = int.Parse(quantityTxt.Text);

        var query = from info in stqmDC.General_Infos
                    where info.Quote_ID == convertedID
                    select info;

        foreach (General_Info info in query)
        {
            info.Customer_Name = customerNameTxt.Text;
            info.OEM_Name = oemNameTxt.Text;
            info.Qty = newQuantity;
            info.Quote_Num = quoteNumberTxt.Text;
            info.Fab_Drawing_Num = fabDrawingNumTxt.Text;
            info.Rfq_Num = rfqNumberTxt.Text;
            info.Rev_Num = revNumberTxt.Text;
        }

        try
        {
            stqmDC.SubmitChanges();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

        var mainTable = from generalInfo in stqmDC.GetTable<General_Info>()
                        select new
                        {
                            generalInfo.Quote_ID,
                            generalInfo.Open_Quote,
                            generalInfo.Customer_Name,
                            generalInfo.OEM_Name,
                            generalInfo.Qty,
                            generalInfo.Quote_Num,
                            generalInfo.Fab_Drawing_Num,
                            generalInfo.Rfq_Num,
                            generalInfo.Rev_Num
                        };



        myGrid.ItemsSource = mainTable;

        leftSP.Visibility = Visibility.Hidden;
        rightSP.Visibility = Visibility.Hidden;
        cancelBtn.Visibility = Visibility.Hidden;
        submitBtn.Visibility = Visibility.Hidden;
        saveBtn.Visibility = Visibility.Hidden;
        sendBtn.Visibility = Visibility.Hidden;

    }

用于在textblocks中显示突出显示的行的代码:

    private void myGridSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var rowSelection = EditGrid.GetSelectedRow(myGrid);

        var quoteID = EditGrid.GetCell(myGrid, rowSelection, 0);
        string quoteIDEdit = ((TextBlock)quoteID.Content).Text;
        QuoteIDtxtblk.Text = quoteIDEdit;

        var date = EditGrid.GetCell(myGrid, rowSelection, 1);
        string dateEdit = ((TextBlock)date.Content).Text;
        Datetxtblk.Text = dateEdit;

        var custName = EditGrid.GetCell(myGrid, rowSelection, 2);
        string custNameEdit = ((TextBlock)custName.Content).Text;
        CustomerNametxtblk.Text = custNameEdit;

        var OemName = EditGrid.GetCell(myGrid, rowSelection, 3);
        string OemNameEdit = ((TextBlock)OemName.Content).Text;
        OemNametxtblk.Text = OemNameEdit;

        var Quantity = EditGrid.GetCell(myGrid, rowSelection, 4);
        string QuantityEdit = ((TextBlock)Quantity.Content).Text;
        Quantitytxtblk.Text = QuantityEdit;

        var quoteNum = EditGrid.GetCell(myGrid, rowSelection, 5);
        string quoteNumEdit = ((TextBlock)quoteNum.Content).Text;
        QuoteNumbertxtblk.Text = quoteNumEdit;

        var fabDrawing = EditGrid.GetCell(myGrid, rowSelection, 6);
        string fabDrawingEdit = ((TextBlock)fabDrawing.Content).Text;
        FabDrawingNumbertxtblk.Text = fabDrawingEdit;

        var rfqNum = EditGrid.GetCell(myGrid, rowSelection, 7);
        string rfqNumEdit = ((TextBlock)rfqNum.Content).Text;
        RfqNumbertxtblk.Text = rfqNumEdit;

        var revNum = EditGrid.GetCell(myGrid, rowSelection, 8);
        string revNumEdit = ((TextBlock)revNum.Content).Text;
        RevNumbertxtblk.Text = revNumEdit;

    }

提前感谢任何可以提供帮助的人。

2 个答案:

答案 0 :(得分:0)

你认为它到底在哪里处理?

要处理导致应用程序崩溃的异常,您需要对每个&#34;入口点&#34;进行异常验证,定义为应用程序中非托管代码可以调用的每个位置,或者代码开始在不同的线程上运行

这包括按钮点击处理程序。在你的按钮处理程序中添加一个try / catch并显示一条错误发生的UI消息并写入一条日志消息或至少一个&#39; Debug.WriteLine(exceptionObjectHere);&#39;所以你可以看到异常来自哪里

答案 1 :(得分:0)

您更改ItemsSourceDataGrid的{​​{1}},这意味着您的选择将会消失,saveBtn_Click将被解雇。

所以你需要在某处处理这种情况(SelectionChanged),如果是这样的话,就什么都不做(返回)。