2010-10-12 48 views
0

当我尝试更新绑定到一个网格视图中的LINQ数据源,我得到以下错误:得到错误,同时更新的LinqDataSource

Could not find a row that matches the given keys in the original values stored in ViewState. Ensure that the 'keys' dictionary contains unique key values that correspond to a row returned from the previous Select operation.

我在网格视图指定DataKeyNames

这里的HTML:

<asp:GridView ID="TaskGridView" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="taskid,statusid,taskdescription" DataSourceID="GridDataSource" 
     onrowcreated="TaskGridView_RowCreated"> 
    <Columns> 
     <asp:TemplateField HeaderText="taskid" InsertVisible="False" 
      SortExpression="taskid"> 
      <ItemTemplate> 
       <asp:Label ID="TaskId" runat="server" Text='<%# Bind("taskid") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="taskdescription" 
      SortExpression="taskdescription"> 
      <EditItemTemplate> 
       <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("taskdescription") %>'></asp:TextBox> 
      </EditItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="TaskDesc" runat="server" Text='<%# Bind("taskdescription") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="url" HeaderText="url" SortExpression="url" /> 
     <asp:TemplateField HeaderText="Status"> 
     <ItemTemplate> 
      <asp:DropDownList runat="server" ID="ddStatus" DataSourceID="DropDownDataSource" DataValueField="statusid" SelectedValue="<%# Bind('Statusid') %>" DataTextField="statusdescription" ></asp:DropDownList> 
     </ItemTemplate> 
     </asp:TemplateField>  
    </Columns> 
</asp:GridView> 
<asp:LinqDataSource ID="GridDataSource" runat="server" 
    ContextTypeName="DailyTask.DailyTaskDBDataContext" TableName="tbl_tasks" 
     EnableUpdate="True"> 
</asp:LinqDataSource> 
<asp:Button ID="btnUpdate" runat="server" onclick="btnUpdate_Click" 
Text="Update" /> 
<asp:LinqDataSource ID="DropDownDataSource" runat="server" 
    ContextTypeName="DailyTask.DailyTaskDBDataContext" TableName="tbl_status"> 
</asp:LinqDataSource> 

下面是相应的代码:

protected void btnUpdate_Click(object sender, EventArgs e) 
{ 
    ListDictionary keyValues = new ListDictionary(); 
    ListDictionary newValues = new ListDictionary(); 
    ListDictionary oldValues = new ListDictionary(); 
    try 
    { 
     keyValues.Add("taskid", ((Label)TaskGridView.Rows[0].FindControl("TaskId")).Text); 
     oldValues.Add("taskdescription", ((Label)TaskGridView.Rows[0].FindControl("TaskDesc")).Text); 
     newValues.Add("taskdescription", "New Taskk"); 
     GridDataSource.Update(keyValues, newValues, oldValues); 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.Message); 
    } 
} 
+1

如果你能显示与这个问题相关的代码/ xaml,它会有很大帮助。 kthx。 – 2010-10-12 19:30:00

回答

0

我这是在代码中的问题

我只需要使用int .Parse()这里因为taskid是主键

keyValues.Add("taskid", int.Parse(((Label)TaskGridView.Rows[0].FindControl("TaskId")).Text));