代码之家  ›  专栏  ›  技术社区  ›  LeonidasFett

使用gridview时“必须声明标量变量”

  •  2
  • LeonidasFett  · 技术社区  · 12 年前

    我在asp.net中的一个web表单上有两个网格视图,后面有c#代码。我还有3个表:user、group和usergroup。

    一个gridview包含一个包含两列的组列表:description和buttonfield。当用户单击此按钮字段时,所选组的成员应显示在第二个网格视图中。

    然而,我得到了一个错误“每次单击按钮字段时必须声明标量变量@GruppenID。这里缺少什么?对不起,我对asp和sql完全陌生…”。。。

    工作:

    <%@ Page Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Gruppenverwaltung.aspx.cs" Inherits="WerIstWo.Gruppenverwaltung" %>
    
    <asp:Content ID="content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
        <h1>Gruppenverwaltung</h1>
        <asp:Panel ID="pnlGruppe" ScrollBars="Both" runat="server">
            <asp:Button ID="btnNeueGruppe" Text="Neue Gruppe" runat="server" OnClick="btnNeueGruppe_Click" />
            <asp:GridView DataKeyNames="GruppenID" OnRowCommand="grdGruppe_RowCommand" ID="grdGruppe" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
                <Columns>
                    <asp:BoundField DataField="Bezeichnung" HeaderText="Bezeichnung" SortExpression="Bezeichnung" />
                    <asp:TemplateField HeaderText="Mitglieder anzeigen">
                        <ItemTemplate>
                            <asp:Button ID="btnMitgliederAnzeigen" runat="server" Text="Mitglieder anzeigen" CommandName="MitgliederAnzeigen"
                                CommandArgument='<%# Eval("GruppenID") %>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:CommandField HeaderText="Archivieren" ButtonType="Button" ShowDeleteButton="true" />
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource OnSelected="SqlDataSource1_Selected" ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="SELECT [Bezeichnung], [GruppenID] FROM [Gruppe] WHERE [Archiviert] != 1"
                DeleteCommand="UPDATE Gruppe SET [Archiviert] = 1 WHERE [GruppenID] = @GruppenID">            
            </asp:SqlDataSource>
            <asp:Button ID="btnZurueck" Text="Zurück" runat="server" OnClick="btnZurueck_Click" />
        </asp:Panel>
        <asp:Panel Visible="false" ID="pnlMitglieder" ScrollBars="Both" runat="server">
            <asp:GridView ID="grdBenutzer" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource2">
                <Columns>
                    <asp:BoundField DataField="Vorname" HeaderText="Vorname" SortExpression="Vorname" />
                    <asp:BoundField DataField="Nachname" HeaderText="Nachname" SortExpression="Nachname" />
                    <asp:BoundField DataField="Geburtsdatum" HeaderText="Geburtsdatum" SortExpression="Geburtsdatum" />
                </Columns>
            </asp:GridView>
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                SelectCommand="SELECT  a.Vorname,
                               a.Nachname,
                               a.Geburtsdatum
                               FROM [Benutzer] a
                               INNER JOIN [BenutzerGruppe] b
                               ON a.BenutzerID = b.BenutzerID
                               INNER JOIN [Gruppe] c
                               ON b.GruppenID = c.GruppenID
                               WHERE c.GruppenID = @GruppenID">
                <SelectParameters>
                    <asp:Parameter Name="GruppenID" />
                </SelectParameters>
            </asp:SqlDataSource>
            <asp:Button ID="Button1" Text="Zurück" runat="server" OnClick="Button1_Click" />
        </asp:Panel>
    </asp:Content>
    


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.SqlClient;
    using System.Data;
    using System.Configuration;
    
    namespace WerIstWo
    {
        public partial class Gruppenverwaltung : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (Session["UserAuthentication"] == null)
                {
                    Response.Redirect("Login.aspx");
                }
            }
    
            protected void btnZurueck_Click(object sender, EventArgs e)
            {
                Response.Redirect("Datenverwaltung.aspx");
            }
    
            protected void btnNeueGruppe_Click(object sender, EventArgs e)
            {
                Response.Redirect("NeueGruppe.aspx");
            }
    
            protected void grdGruppe_RowCommand(object sender, GridViewCommandEventArgs e)
            {
                if (e.CommandName == "MitgliederAnzeigen")
                {
                    string index = e.CommandArgument.ToString();
                    pnlMitglieder.Visible = true;
                    pnlGruppe.Visible = false;
                    SqlDataSource2.SelectParameters["GruppenID"].DefaultValue = index;
                    grdBenutzer.DataBind();             
                }
            }
    
            protected void Button1_Click(object sender, EventArgs e)
            {
                pnlMitglieder.Visible = false;
                pnlGruppe.Visible = true;            
            }
    
            protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e)
            {
    
            }
        }
    }
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   Siz S    12 年前

    必须传递SqlDataSource Select参数。

    由于你是新手,整个过程应该是这样的

    在按钮字段中添加CommandArgument属性

      // <asp:ButtonField ButtonType="Button" CommandArgument="GruppenID"   CommandName="MitgliederAnzeigen" Text="Mitglieder anzeigen" /> 
    
       replace this to
    
        <asp:TemplateField HeaderText="Mitglieder anzeigen">
                <ItemTemplate>
                    <asp:Button ID="btn1" runat="server" Text="Mitglieder anzeigen" CommandName="MitgliederAnzeigen"
                        CommandArgument='<%# Eval("GruppenID") %>' />
                </ItemTemplate>
            </asp:TemplateField>
    

    您的SqlDataSource2必须是

        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
            SelectCommand="select a.Nachname,
            c.GruppenID
            FROM [Benutzer] a
            INNER JOIN [BenutzerGruppe] b
            ON a.BenutzerID = b.BenutzerID
            INNER JOIN [Gruppe] c
            ON b.GruppenID = c.GruppenID
            WHERE   c.GruppenID = @GruppenID
             ">    
        <SelectParameters>
        <asp:Parameter Name="GruppenID" />
    </SelectParameters>
        </asp:SqlDataSource>
    

    now on row命令

    if (e.CommandName == "MitgliederAnzeigen")
            {
     string index = e.CommandArgument.ToString();
               pnlMitglieder.Visible = true;
               pnlGruppe.Visible = false;  
                  SqlDataSource2.SelectParameters["GruppenID"].DefaultValue = index;
                  grdBenutzer.DataBind();
    
            }
    
        2
  •  1
  •   npclaudiu    12 年前

    您需要在中声明SQL参数@GruppenID SqlDataSource1 对于两个 SelectCommand 以及 DeleteCommand ,如下所示:

    <asp:SqlDataSource OnSelected="SqlDataSource1_Selected" ID="SqlDataSource1" runat="server"
        ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
        SelectCommand="SELECT [Bezeichnung], [GruppenID] FROM [Gruppe] WHERE [Archiviert] != 1"
        DeleteCommand="UPDATE Gruppe SET [Archiviert] = 1 WHERE [GruppenID] = @GruppenID">
    
        <SelectParameters>
            <asp:Parameter Name="GruppenID" />
        </SelectParameters>
    
        <DeleteParameters>
            <asp:Parameter Name="GruppenID" />
        </DeleteParameters>
    
    </asp:SqlDataSource>
    

    然后可以设置此参数的值,如 this thread .

    推荐文章