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

时间:2013-03-20 14:58:03

标签: asp.net tsql

我在asp.net中的webform上有两个gridview,后面有c#代码。我还有3个表:用户,组和用户组。

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

然而,我得到一个错误“每次点击buttonfield时都必须声明标量变量@GruppenID。我在这里缺少什么?对不起但我对asp和sql完全是新的...

WORKING:

<%@ 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 个答案:

答案 0 :(得分:2)

您必须传递SqlDataSource选择参数。

当你是新手时,整个过程应该像你的需要一样

在按钮字段

中添加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>

现在在行命令

if (e.CommandName == "MitgliederAnzeigen")
        {
 string index = e.CommandArgument.ToString();
           pnlMitglieder.Visible = true;
           pnlGruppe.Visible = false;  
              SqlDataSource2.SelectParameters["GruppenID"].DefaultValue = index;
              grdBenutzer.DataBind();

        }

答案 1 :(得分:1)

您需要在SqlDataSource1SelectCommand中为DeleteCommand声明SQL参数@GruppenID,如下所示:

<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中一样设置此参数的值。