当我使用LINQ to SQL编辑或删除wpf datagrid中的行时,查询发生异常
我是WPF和C的新手 我正在WPF Datagrid上尝试CRUD操作。我的datagrid显示了两个表中与外键引用链接的记录 但是,当我编辑单元格数据并单击submit按钮时,就会出现问题。异常情况下会显示以下消息 错误:“Exception已在调用时由目标抛出”,并且它指向 我用编辑代码编写的LINQtoSQL查询 执行删除操作时也会出现相同的问题当我使用LINQ to SQL编辑或删除wpf datagrid中的行时,查询发生异常,wpf,datagrid,wpfdatagrid,Wpf,Datagrid,Wpfdatagrid,我是WPF和C的新手 我正在WPF Datagrid上尝试CRUD操作。我的datagrid显示了两个表中与外键引用链接的记录 但是,当我编辑单元格数据并单击submit按钮时,就会出现问题。异常情况下会显示以下消息 错误:“Exception已在调用时由目标抛出”,并且它指向 我用编辑代码编写的LINQtoSQL查询 执行删除操作时也会出现相同的问题 private void LoadDataGrid() { DataClassesDataContext da
private void LoadDataGrid()
{
DataClassesDataContext dataContext = new DataClassesDataContext();
var results = from b in dataContext.iBankNames
join acc in dataContext.iBankAccountNos on b.BankID equals acc.BankId
orderby b.Name ascending
select new
{
BankID = b.BankID,
BankName = b.Name,
BankAccNo = acc.BankAccNo,
BranchName = acc.Branch
};
MyDataGrid.ItemsSource = results;
}
这是我的wpf的XML代码
<DataGrid x:Name="MyDataGrid" x:Uid="MyDataGrid" AutoGenerateColumns="False"
SelectionMode="Single"
AlternationCount="2"
>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Bank ID" Width="SizeToHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox IsReadOnly="True" Text="{Binding BankID,Mode=OneWay}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!----HERE ARE SOME MORE COLOUMNS----->
<DataGridTemplateColumn Header="Edit Row">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Edit" Click="EditButton_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Delete Row">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Delete" Click="DeleteButton_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
我正在使用VS 2012和SQL Server 2012 Express。您可以试试这个。我认为这是正确的工作
private void EditButton_Click(object sender, RoutedEventArgs e)
{
try
{
DataClassesDataContext dataContextEdit = new DataClassesDataContext();
object item = MyDataGrid.SelectedItem;
string m = (MyDataGrid.SelectedCells[cellNumber].Column.GetCellContent(item) as TextBlock).Text
iBankName bank = (from p in dataContextEdit.iBankNames
where p.BankID == m
select p).Single();
bank.Name = (MyDataGrid.SelectedCells[ColumnNumber].Column.GetCellContent(item) as TextBlock).Text
//iBankAccountNo banAccRow = MyDataGrid.SelectedItem as iBankAccountNo;
//similarly another object create and access item
object item = MyDataGrid.SelectedItem;
iBankAccountNo bankAccNo = (from p in dataContextEdit.iBankAccountNos
where p.BankAccNo == banAccRow.BankAccNo
select p).Single();
bankAccNo.BankAccNo = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text
bankAccNo.Branch = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text
dataContextEdit.SubmitChanges();
MessageBox.Show("Row Updated Successfully.");
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
// return;
}
}
我猜,您的问题在于sql操作(可能是:更改主键,或错误外键构造,等等)。尝试在SSMS中直接使用sql语句模拟linq试图做的事情。我在SSMS中做过,但没有发现错误。外键约束中的每一件事都很好。您需要指定更详细的错误消息,如may。哪个linq导致了错误,当您分配bank变量或bankAccNo变量时的那个错误?嗯。。我能想到的可能的错误源:Single()将抛出错误。如果没有与查询匹配的数据,请使用SingleOrDefault()避免此错误。@har07谢谢。银行变量发生错误。但我不知道如何打印整个堆栈错误。我使用了SigleOrDefault(),但它也不起作用。当我在cathc异常上应用ex.InnerException.Message()时,它显示“对象引用未设置为对象的实例”。
private void EditButton_Click(object sender, RoutedEventArgs e)
{
try
{
DataClassesDataContext dataContextEdit = new DataClassesDataContext();
object item = MyDataGrid.SelectedItem;
string m = (MyDataGrid.SelectedCells[cellNumber].Column.GetCellContent(item) as TextBlock).Text
iBankName bank = (from p in dataContextEdit.iBankNames
where p.BankID == m
select p).Single();
bank.Name = (MyDataGrid.SelectedCells[ColumnNumber].Column.GetCellContent(item) as TextBlock).Text
//iBankAccountNo banAccRow = MyDataGrid.SelectedItem as iBankAccountNo;
//similarly another object create and access item
object item = MyDataGrid.SelectedItem;
iBankAccountNo bankAccNo = (from p in dataContextEdit.iBankAccountNos
where p.BankAccNo == banAccRow.BankAccNo
select p).Single();
bankAccNo.BankAccNo = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text
bankAccNo.Branch = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text
dataContextEdit.SubmitChanges();
MessageBox.Show("Row Updated Successfully.");
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
// return;
}
}