2013-05-12 30 views
0

我有DetailsView嵌套在GridView中,我無法弄清楚如何傳遞值(如GridView中的項目ID和會話中的值)到插入方法的參數。嵌套DetailsView插入方法的參數

   <asp:DetailsView ID="DetailsViewPostLikes" runat="server" 
       AutoGenerateRows="false" DataSourceID="odsPostLikes" 
       DataKeyNames="id" GridLines="None"> 
       <Fields> 
       <asp:CommandField ShowInsertButton="true" InsertText="Like" newtext="Like" /> 
        <asp:TemplateField HeaderText="" SortExpression="Nickname"> 
         <ItemTemplate> 
          <asp:Label id="nicknamelikesCount" runat="server" Text='<%# Bind("LikeCount") %>'></asp:Label> people likes this.         
         </ItemTemplate> 
        </asp:TemplateField> 
       </Fields> 
       </asp:DetailsView> 
       <asp:ObjectDataSource ID="odsPostLikes" runat="server" 
       TypeName="SocWebApp.Database.PostLikeTable" 
       SelectMethod="Select" InsertMethod="Insert" UpdateMethod="Update"> 
       <SelectParameters> 
        <asp:Parameter Name="postId" Type="Int32" /> 
       </SelectParameters> 
       <InsertParameters> 
        <asp:Parameter Name="postId" Type="Int32" /> 
        <asp:SessionParameter Name="userId" SessionField="User_id" Type="Int32" /> 
       </InsertParameters> 
       </asp:ObjectDataSource> 

我試圖做同樣的方式爲這樣的選擇參數:

protected void posts_ItemDatabound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow)//(GridView)e.Row.FindControl("odsComments") != null) 
     { 
      ObjectDataSource s1 = (ObjectDataSource)e.Row.FindControl("odsComments"); 
      s1.SelectParameters["postId"].DefaultValue = DataBinder.Eval(e.Row.DataItem, "Id").ToString(); 

      ObjectDataSource s2 = (ObjectDataSource)e.Row.FindControl("odsPostLikes"); 
      s2.InsertParameters["postId"].DefaultValue = DataBinder.Eval(e.Row.DataItem, "Id").ToString(); 

      ObjectDataSource s3 = (ObjectDataSource)e.Row.FindControl("odsPostLikes"); 
      s3.InsertParameters["userId"].DefaultValue = Session["User_id"].ToString(); 
     } 
    } 

但只有userid參數值設置(從Session),是帖子ID始終爲0

什麼是合適的解決方案? 謝謝。

回答

0

我已經找到了解決辦法:

<asp:DetailsView ID="DetailsViewPostLikes" runat="server" 
       AutoGenerateRows="false" DataSourceID="odsPostLikes" 
       DataKeyNames="id" GridLines="None" OnDataBound="postLikeInsert_DataBound" OnItemCommand="postLikeInsert_ItemCommand"> 
       <Fields> 
       <asp:CommandField ShowInsertButton="false" InsertText="Like" newtext="Like" /> 
        <asp:TemplateField HeaderText="" SortExpression="Nickname"> 
         <ItemTemplate> 
          <asp:LinkButton ID="Like" runat="server" CommandName="Insert" Text="Like" /> 
          <asp:Label id="likesCount" runat="server" Text='<%# Bind("LikeCount") %>'></asp:Label> people likes this. 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Fields> 
       </asp:DetailsView> 
       <asp:ObjectDataSource ID="odsPostLikes" runat="server" 
       TypeName="SocWebApp.Database.PostLikeTable" 
       SelectMethod="Select" InsertMethod="Insert" UpdateMethod="Update"> 
       <SelectParameters> 
        <asp:Parameter Name="postId" Type="Int32" /> 
       </SelectParameters> 
       <InsertParameters> 
        <asp:Parameter Name="postId" Type="Int32" /> 
        <asp:SessionParameter Name="userId" SessionField="User_id" Type="Int32" /> 
       </InsertParameters> 
       </asp:ObjectDataSource> 

後臺代碼:

protected void postLikeInsert_DataBound(object sender, EventArgs e) 
    { 
     DetailsView d = (DetailsView)sender; 
     GridViewRow row = (GridViewRow)d.NamingContainer; 
     int idx = row.RowIndex; 
     GridView grid = (GridView)row.NamingContainer; 
     string strGoalIndicatorID = grid.DataKeys[idx]["id"].ToString(); 

     LinkButton b = (LinkButton)d.FindControl("Like"); 
     b.CommandArgument = strGoalIndicatorID; 

    } 

    protected void postLikeInsert_ItemCommand(object sender, DetailsViewCommandEventArgs e) 
    { 
     if (e.CommandName == "Insert") 
     { 
      DetailsView d = (DetailsView)sender; 
      d.ChangeMode(DetailsViewMode.Insert); 
      ObjectDataSource o = (ObjectDataSource)d.NamingContainer.FindControl("odsPostLikes"); 
      o.InsertParameters["postId"].DefaultValue = e.CommandArgument.ToString(); 
     } 
    } 

當數據約束,它會發現按鈕並設置他的命令參數到父GridView控件的ID項,然後在按下按鈕後,根據該命令參數設置插入參數