0

SQL Server データベースに接続されたデータグリッドを持つ WPF C# アプリケーションを作成しています。ユーザーは、行を強調表示して編集ボタンをクリックし、強調表示された行のデータをいくつかのテキストボックスに入力することで、データグリッド内のデータを編集することができます。この時点で、ユーザーはデータを編集し、[保存] をクリックすると、データグリッドに変更が反映されます。最近まで、その機能は正常に機能していました。ただし、強調表示されたデータ行を画面の別の場所に表示する機能を追加するように依頼されました (データグリッドを長時間見続けると面倒になる可能性があるため)。したがって、ユーザーが行をクリックすると、データグリッドの右側にある一連のテキストブロックが変更され、強調表示された行のデータが見やすい形式で表示されます。その機能も正常に動作します。今抱えている問題、行が強調表示され、テキストブロックにデータが自動的に表示されるときに、ユーザーがその行も編集しようとすると、アプリケーションがクラッシュします。ユーザーが編集をクリックした後、テキストボックスにデータが正常に表示されます(テキストブロックで強調表示された同じ行が同時に表示されます)。問題が発生するのは、保存をクリックしたときだけです。

プログラムをデバッグすると、すべてがスムーズに実行されていることがわかります。ただし、[保存] をクリックすると、デバッガーは myGridSelectionChanged イベントに戻り、「NullReferenceException が処理されませんでした -- オブジェクト参照がオブジェクトのインスタンスに設定されていません」と表示されますが、プログラムをリロードすると、以前に試みた変更がデータグリッドに反映されますアプリケーションがクラッシュしました。これは、データベースを実際に編集することとは関係なく、テキストブロックがそれらの編集を反映できないことに問題があることを意味していると思います。以下は私のコードの一部です:

保存ボタンのコードは次のとおりです。

     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;

    }

助けていただける方、よろしくお願いします。

4

2 に答える 2

0

正確にはどこで処理されると思いますか?

アプリのクラッシュを引き起こす例外を処理するには、すべての「エントリポイント」を例外から保護する必要があります。これは、アンマネージコードが呼び出される、またはコードが別のスレッドで実行を開始する、アプリ内のすべてのスポットとして定義されます。

これには、ボタンクリックハンドラーが含まれます。ボタンハンドラーにtry/catchを追加し、エラーが発生したことを示すUIメッセージを表示して、ログメッセージまたは少なくとも「Debug.WriteLine(exceptionObjectHere);」を書き込みます。例外がどこから来たのかがわかります

于 2013-01-10T16:37:30.360 に答える
0

を変更ItemsSourceすると、選択が消えて解雇されることを意味しDataGridます。saveBtn_ClickSelectionChanged

したがって、このケース ( myGrid.SelectedItem == null) をどこかで処理する必要があり、その場合は何もしない (戻る) だけです。

于 2013-01-10T16:49:21.530 に答える