2

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

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

但是,我收到一个错误“每次单击按钮字段时都必须声明标量变量@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)
        {

        }
    }
}
4

2 回答 2

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();

        }
于 2013-03-20T15:16:00.790 回答
1

您需要为SqlDataSource1theSelectCommand和声明 SQL 参数 @GruppenID 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>

然后,您可以像在此线程中一样设置此参数的值。

于 2013-03-20T15:11:26.913 回答