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;
}
助けていただける方、よろしくお願いします。