Laden...

[erledigt] Wie erstelle Ich ein Event für einen Button der erst zur Laufzeit erzeugt wird in ASP.NET

Erstellt von omega90 vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.756 Views
O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren
[erledigt] Wie erstelle Ich ein Event für einen Button der erst zur Laufzeit erzeugt wird in ASP.NET

Hi

Zu Meinem Programm: Ein benutzer kann in einer textBox einen Nachnamen eingeben bzw teilstrings davon und es wird in einer ListView alle Benutzer aufgelistet die diesen TeilString enthalten.

Nun wird in der ListView für jeden Benutzer eine Reihe erstellt in der man die eMail, Den Benutzer, Vorname,Nachname und auch die Telefonnummer sehen kann, dazu kommt noch das jede Reihe einen Button"Anzeigen erhält".

Wenn man auf diesen Button drückt soll man auf eine andere WebForm Oberfläche geleitet werden mit einer string Übergabe in einer Session. Jedoch weiss Ich nicht wie ich ein solches Event erzeugen kann wenn die Buttons erst zur laufzeit erzeugt werden. 😕

In meinem Event muss daher die Id oder die eMail mit übergeben werden...Ich dachte eigentlich an soetwas wie ...

Session["ID"] = // Die Id von dem benutzer in der Reihe vllt durch den Index :/
Response.Redirect(..andere webform.);

Hier ist mein Code:

ASPX:

<asp:ListView runat="server" ID="myListView">

        <LayoutTemplate>
            <table id="UserTable" runat="server" border="0" cellspacing="10" cellpadding="5">
                <tr id="Tr1" runat="server">
                    <th id="Th1" runat="server">Benutzer</th>
                    <th id="Th2" runat="server">eMail</th>
                    <th id="Th3" runat="server">Vorname</th>
                    <th id="Th4" runat="server">Nachname</th>
                    <th id="Th5" runat="server">Telefon</th>
                </tr>
                <tr runat="server" id="ItemPlaceholder">
                </tr>
            </table>
        </LayoutTemplate>

        <ItemTemplate>
   
            <tr runat="server"> 
                
                <td align="left" ><asp:Label ID="Label1" Text='<%# Eval("Benutzer") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label2" Text='<%# Eval("eMail") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label3" Text='<%# Eval("Vorname") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label4" Text='<%# Eval("Nachname") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label5" Text='<%# Eval("Telefon") %>' runat="server" /></td>
                <td align="left"><asp:Button ID="Button1" Text ="Anzeigen" runat="server" /></td>
               
            </tr>
        
        </ItemTemplate>

        </asp:ListView>

Beim Button kann man das onClick Ereignis übergen...aber Ich weiss leider nicht wie Ich das dazugehörige Event erstellen kann 😦

Hilfe

Gruß W.T 🙂

5.941 Beiträge seit 2005
vor 11 Jahren

Hallo Omega90

Übergib die ID doch per Url?
Ansonsten musst du genauer sagen, was du nicht verstehst.

Was ist das Problem mit OnClick?
Das geht ja im ItemTemplate.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

16.827 Beiträge seit 2008
vor 11 Jahren

Das sind Grundlagen von ASP...und wird genauso gehandhabt wie in normalen Anwendungen auch.

Viele Buttons zeigen auf ein Event.
Der senderist der Eventauslöser; anhand dessen kannst Du spezifisch reagieren.

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Das Problem ist ja nicht die Übegabe und das es ein onClick besitzt weiss ich auch^^ Nur ist es so das Ich nicht weiss wie Ich auf ein Ereignis reagieren kann wenn die Buttons erst erzeugt werden wenn die ListView gefüllt wird 😕

Ist ja nicht so als hätte Ich es nicht versucht.. z.B.

aspx:

 <td align="left"><asp:Button ID="Button1" OnCommand="Button1_Command" CommandArgument='<%# eval("ID") %>' CommandName="Anzeigen" runat="server" /></td>

cs:

void Button1_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "Anzeigen")
            {
                string sID = e.CommandArgument.ToString();
                int id = 0;
                int.TryParse(sID, out id);

                if (id > 0)
                {
                    //
                }
            }
        }

und bekomme dann folgende Fehlermeldung:

ASP.benutzerliste_aspx" enthält keine Definition für "Button1_Command", und es konnte keine Erweiterungsmethode "Button1_Command" gefunden werden, die ein erstes Argument vom Typ "ASP.benutzerliste_aspx" akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?).

Gruß W.T 🙂

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

es ist wie Abt sagt - du brauchst einen EventHandler, der alle diese Buttons behandeln kann, und dann nutzt Du ganz normal das OnClick und gibst dort diesen Handler an.
Der sender ist dann der Button.

Im EventHandler kannst Du Dir das richtige Item aus der ListView raussuchen, indem Du alle Items durchläufst, mit FindControl auf den Items den zugehörigen Button ermittelst und dann mit dem sender vergleichst.

Besser ist aber die vorgehensweise mit dem Command und CommandArgument,
wie Du es versucht hast. Die Fehlermeldung ist seltsam, eigentlich sollte das funktionieren. Der Handler sollte protected sein, nicht private - vielleicht ist das der Fehler.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Ah Ok das hört Sich doch gut an ...danke 😛

Gruß W.T 🙂

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Was ist den daran falsch Oo ?

aspx

<asp:Button ID="Button1" Text="Anzeigen" OnCommand="Button1_Command" CommandName="Anzeigen" runat="server" />

cs

protected void Button1_Command(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "Anzeigen")
            {
                Response.Redirect("Benutzer.aspx"); 

            }

        }

Gruß W.T 🙂

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

Was ist den daran falsch Oo ?

Die EventArgs haben den falschen Typ.

Folgender Code läuft bei mir wunderbar:
aspx:

<asp:Button ID="Button1" Text="Anzeigen" OnCommand="Button1_Command" CommandName="Anzeigen" CommandArgument="myArgument" runat="server" />

cs:

    protected void Button1_Command(object sender, CommandEventArgs e)
    {
      if (e.CommandName == "Anzeigen")
      {
        Response.Redirect("Benutzer.aspx");

      }

    }


Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Ja stimmt 😄

danke!!! es geht

Gruß W.T 🙂

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Wie erhalte Ich jetzt die Informationen von dieser Reihe in der, der Button war. Zum Beispiel wenn Ich die email haben möchte von dem ausgewählten Benutzer.
Wie kann Ich das in einen String übergben?

Ich denke man benötigt den Index von der Zeile in der der Button war oder so ion der Art.

 protected void Button1_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "Anzeigen")
            {
               int selectedIndex = myListView.SelectedIndex;

             //Das geht nicht ;(
               
              string SessionObject =myListView.Items[selectedIndex].SubItems[1].Text);

//Übergae von eMail oder einem anderen Parameter 

Session["eMail"] = SessionObejct;
                Response.Redirect("Benutzer.aspx");

            }
}

die Übergabe kann man auch über QueryString übergeben jedoch ist es erst mal nur wichtig das ich irgendwas übergebe 😦

Gruß W.T 🙂

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Ok Ich glaube Ich habe eine Lösung...kann die aber erst am montag testen da Ich daheim keine AD Datenbank besitze..außer ich baue mir schnell eine Anwendung zum testen 😛

protected void Button1_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "Anzeigen")
            {
                // User in the Line

                Label lb = (Label)myListView.Items[1].FindControl("Label2");

                   Session["email"] = email; 

                Response.Redirect("Benutzer.aspx");

            }

EDIT: Hab noch was vergessen^^

string email = lb.Text;

Gruß W.T 🙂

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

mit myListView.Items[1] liest Du immer dasselbe Item aus.

Übergebe entweder im CommandArgument einen Wert, der Dir eindeutig die Zeile identifiziert, oder benutze den sender, und durchlaufe dann Deine Items, um das richtige herauszusuchen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

ich hab dazu einige Fragen...

Es ging mir natürlich erst nur darum das es überhaupt funktioniert, aber jetzt brauch Ich wie du schon sagtest den richtigen Index.

Ich habe meine ASPX Seite ein wenig geändert:

...

 <ItemTemplate>
   
            <tr runat="server"> 
                
                <td align="left" ><asp:Label ID="Label1" Text='<%# Eval("Benutzer") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label2" Text='<%# Eval("eMail") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label3" Text='<%# Eval("Vorname") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label4" Text='<%# Eval("Nachname") %>' runat="server" /></td>
                <td align="left"><asp:Label ID="Label5" Text='<%# Eval("Telefon") %>' runat="server" /></td>

             <td align="left"><asp:LinkButton runat="server" Text="Anzeigen" CommandName="Anzeigen" OnCommand="ListView1_ItemCommand"></asp:LinkButton></td>
               
            </tr>
        
        </ItemTemplate>

...

Dazu die Cs Datei:

...

protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "Anzeigen")
            {
                Label lbText = (Label)e.Item.FindControl("Label2");

               string email = lbText.Text;

               Session["email"] = email;

               Response.Redirect("Benutzer.aspx");

            }
        }

...

Ich bekomme aber immer wieder den Fehler: CS0123: Keine Überladung für "ListView1_ItemCommand" stimmt mit dem Delegaten "System.Web.UI.WebControls.CommandEventHandler" überein.

Wie gehe Ich den vor wenn ich das realisieren möchte was du mir gesagt hast mit dem CommandArgument 😕

und ist es egal ob man das ganze mit einem Button oder einem LinkButton macht?

Gruß W.T 🙂

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

der Fehler ist immer noch, dass Du im Command des Buttons mit den ListView-Handlern arbeiten willst.

Am einfachsten hast Du es, wenn Du als CommandName des Buttons den (vordefinierten) Namen "Select" benutzt. Dieser vordefinierte Name aktiviert gewissermassen die im ListView eingebaute automatische Selektion.

Dann kannst Du in Deiner ListView auf die OnSelectedIndexChanging/OnSelectedIndexChanged-Events reagieren, und mit der SelectedIndex-Property arbeiten.

Das müsste genau das sein, was Du suchst. Wahrscheinlich kommst Du dann sogar ohne CommandArgument aus.

und ist es egal ob man das ganze mit einem Button oder einem LinkButton macht? Ja.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Meinst du das?

protected void Button1_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "Select")
            {
                //Gibt immer -1 zurück
                int selectedIndex = myListView.SelectedIndex;

                
                Label lb = (Label)myListView.Items[selectedIndex].FindControl("Label2");

                string email = lb.Text;

                Session["email"] = email;

                Response.Redirect("Benutzer.aspx");

            }

        }

Weil wenn ja geht das nicht habe Ich versucht ...Ich versth halt nicht warum das immer die -1 zurück gibt 😕

Gruß W.T 🙂

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

ich meine sowas:
aspx:

<asp:ListView ID="ListView1" OnSelectedIndexChanging="ListView1_OnSelectedIndexChanging" runat="server">
  ...
  <ItemTemplate>
    ...
    <asp:Button ID="myButton" Text="Auswahl" CommandName="Select" runat="server"/>
    ...
</ItemTemplate>
</asp:ListView>

cs:

    protected void ListView1_OnSelectedIndexChanging(object sender, ListViewSelectEventArgs e)
    {
      // der neue Index steckt in den ListViewSelectEventArgs, soll er später noch
      // verwendet werden, muss hier ListView.SelectedIndex damit besetzt werden.
      ListView1.SelectedIndex = e.NewSelectedIndex;
    }

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

AChso ...ja ich habe jetzt das Problem gelöst 😃

ASPX:

<td align="left"><asp:Button ID="Button1" Text="Anzeigen" OnCommand="Button1_Command" CommandName="Select" CommandArgument='<%# Container.DataItemIndex %>'  runat="server" /></td>

CS:

protected void Button1_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "Select")
            {
               int index = Convert.ToInt32(e.CommandArgument);
               
                Label lb = (Label)myListView.Items[index].FindControl("Label2");

                string email = lb.Text;

                Session["email"] = email;

                Response.Redirect("Benutzer.aspx");

            }

        }

Ich habe den Index mit CommandArgument='<%# Container.DataItemIndex %>' ermitellt und dann im Codebehind abgefragt 😛

Vllt nicht die beste methode aber es funktioniert erst mal und Ich kann weiter machen 😃 trotzdem danke für deine Mühe ! 😃

Gruß W.T 🙂

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

auch eine Möglichkeit 😉

Schau Dir trotzdem mal die Version von mir an: Der Button bekommt nur den CommandName "Select", ein OnCommand für den Button wird gar nicht angegeben.

Dann handelt die ListView das Command über SelectedIndexChanging/SelectedIndexChanged.
Das ist etwas "sauberer".

Gruß, MarsStein.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca