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 🙂
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
Das sind Grundlagen von ASP...und wird genauso gehandhabt wie in normalen Anwendungen auch.
Viele Buttons zeigen auf ein Event.
Der sender
ist der Eventauslöser; anhand dessen kannst Du spezifisch reagieren.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 🙂
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
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 🙂
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
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 🙂
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 🙂
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
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 🙂
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
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 🙂
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
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 🙂
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