簡體   English   中英

NullReferenceException未處理,我不知道為什么?

[英]NullReferenceException was unhandled and I don't know why?

我正在創建一個WPF C#應用程序,該應用程序具有連接到SQL Server數據庫的數據網格。 用戶可以選擇突出顯示一行並單擊編輯按鈕,然后用突出顯示的行中的數據填充幾個文本框,從而編輯數據網格中的數據。 此時,用戶可以編輯數據,單擊“保存”,數據網格將反映所做的更改。 直到最近,該功能還可以正常工作。 但是,我被要求添加一項功能,該功能可以在屏幕上其他位置顯示突出顯示的數據行(因為長時間查看數據網格可能會很煩人)。 因此,當用戶單擊一行時,數據網格右側的一系列文本塊將更改,以更易於查看的格式顯示突出顯示的行的數據。 該功能也可以正常工作。 我現在遇到的問題是,當突出顯示一行並自動在文本塊中顯示數據時,如果用戶也嘗試編輯該行,則應用程序將崩潰。 用戶單擊編輯后,數據在文本框中顯示的很好(同時在文本塊中顯示了相同的突出顯示的行); 只是單擊保存時,我遇到了問題。

對該程序進行調試表明,所有操作均正常進行。 但是,單擊“保存”后,調試器跳回到我的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;

    }

以及用於在文本塊中顯示突出顯示的行的代碼:

    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;

    }

在此先感謝任何可以提供幫助的人。

您認為應該在哪里處理?

要處理導致應用程序崩潰的異常,您需要對每個“入口點”進行異常驗證,這些入口點定義為應用程序中可以調用非托管代碼或代碼開始在其他線程上運行的每個位置。

這包括按鈕單擊處理程序。 在您的按鈕處理程序中添加try / catch,並顯示一些UI消息,指出發生了錯誤,然后寫一條日志消息或至少顯示一個'Debug.WriteLine(exceptionObjectHere);' 這樣您可以看到異常來自何處

您可以在saveBtn_Click更改DataGrid ItemsSource ,這意味着您的選擇將saveBtn_Click ,並且SelectionChanged將被觸發。

因此,您需要在某處處理這種情況( myGrid.SelectedItem == null ),如果是,則什么也不做(返回)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM