【问题标题】:SQLDataSource DeleteCommand to get parametersSQLDataSource DeleteCommand 获取参数
【发布时间】:2012-01-12 07:47:33
【问题描述】:

我在将参数传递给 DELETE 命令时遇到了一些问题,并且似乎无法很好地理解它的工作原理。

<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 语句很简单,需要一个用户ID 输入参数。 但是,DELETE 语句需要 2 个参数输入。 in_acntID = 用户 ID in_propID = 绑定字段数据字段 prop_id

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

我希望删除按钮实现如下:

  1. 从数据库中的表中删除记录
  2. 从网格视图中删除行

更新

经过一些额外的研究,我发现,参数的NAME和Boundfield的HeaderText必须相同,这样你的gridview中的值才能被数据源的SQL命令使用。

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

现在一切正常。

【问题讨论】:

    标签: c# datagridview sqldatasource delete-row


    【解决方案1】:

    根据MSDN documentation,需要在gridView上指定DataKeyNames:

    "使用 DataKeyNames 属性来指定表示数据源主键的一个或多个字段。您必须设置 DataKeyNames 属性才能使 GridView 控件的自动更新和删除功能起作用。这些值关键字段被传递给数据源控件,以指定要更新或删除的行。"

    【讨论】:

    • 我尝试添加 datakeynames DataKeyNames="prop_id, acnt_id",但仍然没有达到我想要的结果。当我将值传递给 datakeynames 时,它如何作为参数传递给 sdsPropertyList_Deleting 命令?
    • 这个答案是我的解决方案,我看到您的解决方案是由于另一个问题,但想提醒人们如果您希望将它们作为参数包含在内,请始终包含所有数据键,谢谢您的回答!
    【解决方案2】:

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

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

    我已成功使用上述方法删除 .这可能适用于文本框或标签。如果您正在处理事件,为什么不把整个删除过程交给偶数处理程序呢?在那里指定整个 sql 设置,包括连接、命令执行。这种方法也对我有用。

    【讨论】:

      【解决方案3】:

      经过一些额外的研究,我发现,参数的NAME和Boundfield的HeaderText必须相同,这样你的gridview中的值才能被数据源的SQL命令使用。

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

      现在一切正常。

      <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>
      

      【讨论】:

        猜你喜欢
        • 2015-03-14
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多