我正在创建一个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;
}
提前感谢任何可以提供帮助的人。
答案 0 :(得分:0)
你认为它到底在哪里处理?
要处理导致应用程序崩溃的异常,您需要对每个&#34;入口点&#34;进行异常验证,定义为应用程序中非托管代码可以调用的每个位置,或者代码开始在不同的线程上运行
这包括按钮点击处理程序。在你的按钮处理程序中添加一个try / catch并显示一条错误发生的UI消息并写入一条日志消息或至少一个&#39; Debug.WriteLine(exceptionObjectHere);&#39;所以你可以看到异常来自哪里
答案 1 :(得分:0)
您更改ItemsSource
中DataGrid
的{{1}},这意味着您的选择将会消失,saveBtn_Click
将被解雇。
所以你需要在某处处理这种情况(SelectionChanged
),如果是这样的话,就什么都不做(返回)。