2013-03-20 64 views
2

我有兩個gridview在asp.net中使用c#代碼後面的網格。我也有3個表格:用戶,組和用戶組。「必須聲明標量變量」使用gridview時

一個gridview包含一個有兩列的組列表:一個描述和一個buttonfield。當用戶點擊這個按鈕時,所選組的成員應該顯示在第二個gridview中。 。

然而

,我得到一個錯誤「必須聲明標量變量@GruppenID的每一次點擊的ButtonField字段我失去了什麼對不起在這裏,但我完全新的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) 
     { 

     } 
    } 
} 
+0

你在哪裏傳遞'@ GruppenID'命令參數來查詢? – 2013-03-20 15:05:07

+0

對不起,但就像我說的,我真的是新來的這個東西......幾乎你在上面的代碼中看到的所有東西都來自本網站上的其他帖子......我以爲它是在同一頁上,變量將是可以從其他GridView – LeonidasFett 2013-03-20 15:07:10

+0

使用'SelectParameters> '在sql數據源 – 2013-03-20 15:13:14

回答

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

     } 
+0

當我把CommandArgument放在buttonfield標籤中時,我得到一個解析器錯誤......它說ButtonField沒有靜態屬性CommandArgument(抱歉,如果這在翻譯時有點遺失,錯誤是在德國) – LeonidasFett 2013-03-20 15:24:39

+0

@LeonidasFett對不起趕緊回答,更新我的回答 – 2013-03-20 15:30:56

+0

它仍然不工作...現在我在這一行中得到一個NullReferenceException:SqlDataSource2.SelectParameters [「GruppenID」]。DefaultValue = index; RowCommand方法 – LeonidasFett 2013-03-20 15:37:35

1

您需要聲明的SQL參數@GruppenID在SqlDataSource1同時爲SelectCommandDeleteCommand,就像這樣:

<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設置的值。

+0

好吧,當我嘗試這個,我在第一個gridview中沒有更多的輸出。現在它只是空的 – LeonidasFett 2013-03-20 15:17:28

+0

這是因爲當調用'MitgliederAnzeigen'命令時(在'grdGruppe_RowCommand'中),您需要設置通過'@ GruppenID'參數傳遞的值。 – npclaudiu 2013-03-20 15:20:54