我有一个从LinqDataSource填充的GridView。当我更新一行时,RowCommand将触发并且更改将持久保存到数据库,但Grid不会刷新。我在UpdatePanel中有它,并在RowCommand处理程序中明确地调用Update(),但没有回发,页面只是在编辑模式下。单击取消后,它将返回到仅查看状态,网格将显示新值。
我怀疑GridView中有关数据源的信息是错误的。不过,没有例外。下面是标记的精简副本。有什么想法吗?
<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional"
EnableViewState="true" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:LinqDataSource ID="YieldDataSource" runat="server"
ContextTypeName="myhDataContext" TableName="vw_drug_yields"
OnSelecting="YieldDataSource_Selecting" EnableUpdate="true" />
<asp:GridView ID="YieldGridView" runat="server" Width="900px"
OnRowDataBound="editGrid_RowDataBound"
DataSourceID="YieldDataSource" EnableViewState="true"
OnRowCommand="YieldGridView_RowCommand">
<Columns>
<asp:TemplateField HeaderText="Net Fill" ItemStyle-HorizontalAlign="Center">
<ItemTemplate><%# DataBinder.Eval(Container.DataItem, "net_fill") %>
</ItemTemplate>
<EditItemTemplate><asp:TextBox ID="tbNetFill" runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "net_fill") %>' >
</asp:TextBox></EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False" ItemStyle-Width="40px">
<ItemTemplate>
<asp:ImageButton CommandName="Edit" ID="btnEdit" SkinID="btnEdit"
runat="server" ToolTip="Edit" CausesValidation="false"/>
</ItemTemplate>
<EditItemTemplate>
<asp:ImageButton CommandName="Update" ID="btnSubmit" SkinID="btnSubmit"
runat="server" ToolTip="Save" CausesValidation="true"
CommandArgument="<%# ((GridViewRow) Container).DataItemIndex %>" />
<asp:ImageButton CommandName="Cancel" ID="btnCancel" SkinID="btnCancel"
runat="server" ToolTip="Cancel" CausesValidation="false"/>
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView></ContentTemplate></asp:UpdatePanel>
处理程序:
protected void YieldGridView_RowCommand(Object sender,
GridViewCommandEventArgs e) {
if (e.CommandName == "Update") {
try {
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow gdrow = YieldGridView.Rows[index];
// do some validation and handle update
db.SubmitChanges();
YieldGridView.DataBind();
uPanel.Update();
}
catch (Exception ex) {
ShowError(this, "Error while updating yields", ex, true);
}
}
答案 0 :(得分:3)
删除UpdatePanel并关闭GridView的回调后,单击“更新”按钮时收到以下错误:
找不到与之匹配的行 给出原始值中的键 存储在ViewState中。确保 'keys'字典包含唯一键 与行对应的值 从上一个Select返回 操作
问题在于此数据没有唯一的唯一键,因为它是从不同来源动态组合的。它不应该被需要,但似乎没有它的LinqDataSource的GridView无法运行。 另外,我从一个没有主键的View填充网格。 解决方案涉及3个变化:
感谢您的帮助。
答案 1 :(得分:0)
在调用Update()之前,调用GridView.DataBind()来重新绑定LINQDataSource控件。
答案 2 :(得分:0)
试试这个:
YieldGridView.DataBind();
//though this seems useless after call to DataBind, but lets just try :)
YieldGridView.EditIndex = -1;
uPanel.Update();