2011-12-03 183 views
0

我有一些问题传递参数到DELETE命令,似乎不能很好地理解它是如何工作的。SQLDataSource DeleteCommand获取参数

<asp:SqlDataSource ID="sdsPropertyList" 
    runat="server" 
    ProviderName="<%$ appSettings:ProviderName %>" 
    ConnectionString="<%$ appSettings:ConnectionString %>" 
    SelectCommand="selPropertyByAcntID" 
    SelectCommandType="StoredProcedure" 
    OnSelecting="sdsPropertyList_Selecting" 
    OnSelected="sdsPropertyList_Selected" 
    DeleteCommand="delPropertyByPropID" 
    DeleteCommandType="StoredProcedure" 
    OnDeleting="sdsPropertyList_Deleting" 
    OnDeleted="sdsPropertyList_Deleted"> 
    <SelectParameters> 
     <asp:Parameter Name="in_acntID" Type="Int32" DefaultValue="0" /> 
    </SelectParameters> 
    <DeleteParameters> 
     <asp:Parameter Name="in_acntID" Type="Int32" DefaultValue="0" /> 
     <asp:Parameter Name="in_propID" Type="Int32" DefaultValue="0" /> 
    </DeleteParameters> 
</asp:SqlDataSource> 

<asp:GridView ID="gvProperty" runat="server" DataSourceID="sdsPropertyList" 
    AutoGenerateColumns="false" CssClass="gvPropList"> 
    <Columns> 
     <asp:BoundField HeaderText="ID" InsertVisible="true" DataField="prop_id" ReadOnly="true" Visible="False" /> 
     <asp:BoundField HeaderText="Property" DataField="prop_title" 
      ItemStyle-CssClass="gvPropTitle" > 
     <ItemStyle CssClass="gvPropTitle" /> 
     </asp:BoundField> 
     <asp:BoundField HeaderText="Units" DataField="unitCount" 
      ItemStyle-CssClass="gvUnitCount" > 
     <ItemStyle CssClass="gvUnitCount" /> 
     </asp:BoundField> 
     <asp:BoundField DataField="prop_lastmodified" HeaderText="Last Modified" 
      ItemStyle-CssClass="gvDate" DataFormatString="{0:M/dd/yyyy hh:mm tt}" > 
     <ItemStyle CssClass="gvDate" /> 
     </asp:BoundField> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:LinkButton ID="lbtnEdit" runat="server" CommandName="EditRecord" Text="Edit" CommandArgument='<%# Eval("prop_id") %>'></asp:LinkButton> 
       <asp:LinkButton ID="lbtnDelete" runat="server" CommandName="Delete" Text="Delete" CommandArgument='<%# Eval("prop_id") %>'></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:LinkButton ID="lbtnAdd" runat="server" CommandName="AddRecord" Text="Add" CommandArgument='<%# Eval("prop_id") %>'></asp:LinkButton> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
    <HeaderStyle CssClass="headerPropList"/> 
    <RowStyle CssClass="gvPropRow" /> 
</asp:GridView> 

protected void sdsPropertyList_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
    { 
     int userID = Convert.ToInt32(Page.User.Identity.Name); 
     if (userID != 0) 
      e.Command.Parameters["in_acntID"].Value = userID; 
    } 

protected void sdsPropertyList_Deleting(object sender, SqlDataSourceCommandEventArgs e) 
    { 
     int userID = Convert.ToInt32(Page.User.Identity.Name); 
     if (userID != 0) 
     { 
      e.Command.Parameters["in_acntID"].Value = userID; 
     } 
    } 

SELECT语句很简单,它需要一个输入参数userID。 但是,DELETE语句需要2个参数输入。 in_acntID = userID in_propID =绑定字段数据字段prop_id

我在做什么错了?并且如果我在SqlDataSource级别定义了CommandName和CommandArgument,它们应该在ItemTemplate级别传递吗?

我想删除按钮来实现以下目标:从表(S)在DB

  • 在GridView
  • UPDATE

    后删除行

    1. 删除记录一些额外的研究,我发现,参数的名称和绑定字段的HeaderText必须是相同的,以便您的gridview中的值可以被SQL com使用数据源的主角。

      除了最初的select命令,我已经删除了引用后面的所有代码。

      现在一切正常。

    回答

    0

    经过一些额外的研究后,我发现参数的名称和绑定字段的HeaderText必须相同,以便数据源的SQL命令可以使用gridview中的值。

    除了最初的select命令,我已经删除了引用后面的所有代码。

    现在一切正常。

    <asp:SqlDataSource ID="sdsPropertyList" 
        runat="server" 
        ProviderName="<%$ appSettings:ProviderName %>" 
        ConnectionString="<%$ appSettings:ConnectionString %>" 
        SelectCommand="selPropertyByAcntID" 
        SelectCommandType="StoredProcedure" 
        OnSelecting="sdsPropertyList_Selecting" 
        DeleteCommand="delPropertyByPropID" 
        DeleteCommandType="StoredProcedure" 
        OnDeleted="sdsPropertyList_Deleted" > 
        <SelectParameters> 
         <asp:Parameter Name="acnt_id" Type="Int32" /> 
        </SelectParameters> 
        <DeleteParameters> 
         <asp:Parameter Name="acnt_id" Type="Int32" /> 
         <asp:Parameter Name="prop_id" Type="Int32" /> 
        </DeleteParameters> 
    </asp:SqlDataSource> 
    <asp:GridView ID="gvProperty" runat="server" DataSourceID="sdsPropertyList" 
        AutoGenerateColumns="false" CssClass="gvPropList" DataKeyNames="acnt_id, prop_id"> 
        <Columns> 
         <asp:BoundField HeaderText="acnt_id" InsertVisible="true" DataField="acnt_id" ReadOnly="true" Visible="False" /> 
         <asp:BoundField HeaderText="prop_id" InsertVisible="true" DataField="prop_id" ReadOnly="true" Visible="False" /> 
         <asp:BoundField HeaderText="Property" DataField="prop_title"> 
         <ItemStyle CssClass="gvPropTitle" /> 
         </asp:BoundField> 
         <asp:BoundField HeaderText="Units" DataField="unitCount" > 
         <ItemStyle CssClass="gvUnitCount" /> 
         </asp:BoundField> 
         <asp:BoundField DataField="prop_lastmodified" HeaderText="Last Modified" 
          ItemStyle-CssClass="gvDate" DataFormatString="{0:M/dd/yyyy hh:mm tt}" > 
         <ItemStyle CssClass="gvDate" /> 
         </asp:BoundField> 
         <asp:BoundField HeaderText="Active" DataField="prop_active"> 
         <ItemStyle CssClass="gvPropActive" /> 
         </asp:BoundField> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:LinkButton ID="lbtnEdit" runat="server" CommandName="EditRecord" Text="Edit"></asp:LinkButton> 
           <asp:LinkButton ID="lbtnDelete" runat="server" CommandName="Delete" Text="Delete"></asp:LinkButton> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:LinkButton ID="lbtnAdd" runat="server" CommandName="AddRecord" Text="Add"></asp:LinkButton> 
          </ItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
        <HeaderStyle CssClass="headerPropList"/> 
        <RowStyle CssClass="gvPropRow" /> 
    </asp:GridView> 
    
    0

    例如如果该id在列表框或下拉列表中

    <DeleteParameters> 
           <asp:ControlParameter ControlID="controlname" Name="id" PropertyName="SelectedValue" Type="Int32" /> 
            </DeleteParameters> 
    

    我已经使用上述成功删除。这可以用于文本框或标签。如果你正在处理事件,为什么不把整个删除过程带到偶数处理程序?指定整个SQL设置,包括连接,在那里执行命令。这种方法也适用于我。

    2

    按照MSDN documentation,你需要在GridView上指定的DataKeyNames:

    “使用DataKeyNames属性指定代表数据源的主键的一个或多个字段,则必须设置DataKeyNames属性。为了使GridView控件的自动更新和删除功能正常工作,这些关键字段的值被传递给数据源控件,以便指定要更新或删除的行。

    +0

    我试着添加datakeynames DataKeyNames =“prop_id,acnt_id”,但仍然没有达到我想要的结果。 当我将值传递给datakeynames时,它如何作为参数传递给sdsPropertyList_Deleting命令? – Rick

    +0

    这个答案对我来说是修复的,我看到你的解决方案是由于不同的问题,但是想要提醒人们总是包含所有的数据键,如果你想把它们作为参数包含在内,谢谢你的回答! – SelAromDotNet