Web user controlba dropdownlis elhelyezése

Web user controlba dropdownlis elhelyezése
2010-12-06T10:17:13+01:00
2010-12-07T16:38:18+01:00
2022-11-20T02:41:54+01:00
laciik
Web user control oldalra szeretnék egy egyszerű drop down list elemet elhelyezni és ennek a SelectedIndexChanged eseményét kezelni.
Hiába választom ki az elemet a SelectedIndexChanged-re rá sem fut a program, mintha nem is történne kiválasztás.
Amin gyakorlatozok:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Oli.ascx.cs" Inherits="Osztalyok_Oli" %>

<div>
<asp:DropDownList ID="ddlEvek" runat="server"
Width="137px" onselectedindexchanged="ddlEvek_SelectedIndexChanged">
</asp:DropDownList>

</div>
<asp:Label ID="lblSzov" runat="server" Text="Label"></asp:Label>

és a codebehind

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Osztalyok_Oli : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
//if (!Page.IsPostBack)
//{
Evekfelt();

//}

}

protected void Evekfelt()
{
ddlEvek.Items.Add("2010_2011");
ddlEvek.Items.Add("2011_2012");
ddlEvek.Items.Add("2012_2013");
ddlEvek.Items.Add("2013_2014");
}


protected void ddlEvek_SelectedIndexChanged(object sender, EventArgs e)
{
lblSzov.Text = "aaaaaaaaaaaaaa";
}


}

Ha valaki ki tudná bogozni miért nem megy?
Mutasd a teljes hozzászólást!
Azt elfelejtettem mondani, hogy az első esetben nem kell a feltöltő eljárásod, csak a markup AutoPostBack="true" -val és a SelectedIndexChanged.

Nézd át alaposabban.

Nem szokásom más helyett kódot írni, de ha ennyire nem megy, itt egy kis bemutató:

ascx markup:
<asp:DropDownList runat="server" ID="ddlColors1" AutoPostBack="true" onselectedindexchanged="ddlColors_SelectedIndexChanged"> <asp:ListItem Text="Green" Value="green"/> <asp:ListItem Text="Red" Value="red"/> </asp:DropDownList> <br /> <asp:DropDownList runat="server" ID="ddlColors2" AutoPostBack="true" onselectedindexchanged="ddlColors_SelectedIndexChanged"> </asp:DropDownList> <br /> <asp:TextBox runat="server" ID="tbColor"/>

CodeBehind:

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Feltolt(); } } protected void Feltolt() { Dictionary<string, string> d = new Dictionary<string, string>(); d.Add("green", "Green"); d.Add("red", "Red"); ddlColors2.DataSource = d; ddlColors2.DataTextField = "Value"; ddlColors2.DataValueField = "Key"; ddlColors2.DataBind(); } protected void ddlColors_SelectedIndexChanged(object sender, EventArgs e) { if (sender is DropDownList) { DropDownList d = (DropDownList)sender; tbColor.Text = d.ID + " " + d.SelectedValue; } }

Ne tévesszen meg, hogy mindkettőnek ugyanaz a selectedindexchanged event handlere, az csak azért van mert lusta voltam többet gépelni
Mutasd a teljes hozzászólást!

  • Szia!

    A dropdownra kapcsold be az autopostback-et.

    Az autopostback hatására küldi el selectedindex változáskor az adatokat a servernek.

    Szerk.:
    Most látom, hogy ki van kommentezve, az ispostback feltétel. Azt mindenképpen oda rakd, mert csak akkor kell feltölteni, hogy betöltődik az oldal, postback után nem kell.
    Mutasd a teljes hozzászólást!
  • Ha bekapcsolom az autopostback-et akkor üres marad a ddlEvek, nem lesz feltöltve.
    Mutasd a teljes hozzászólást!
  • A load-ban visszaírtad, hogy csak akkor töltse fel, ha nem volt postback?

    Ha nincs bekapcsolva a dropdown listádon az autopostback, akkor csak akkor fog lefutni a selectedindexchange, mikor megtröténik az első postback.

    Próbáld meg azt is, hogy teszt céljából pakolj rá egy gombot, ami legyen autopostback, és a dropdownról pedig vedd le az autopostback-et, és nézd meg, hogy gomb katt után belemegy-e a selectedindexchange-be.
    Mutasd a teljes hozzászólást!
  • Ha bekapcsolom az autopostback-et akkor üres marad a ddlEvek, nem lesz feltöltve.


    Adjál neki viewstate-et (EnableViewState="True"). Illetve ellenőrizd hogy van-e valami mögöttes kódod ami postback alatt törli az elemeket.

    Morzel
    Mutasd a teljes hozzászólást!
  • Ha a loadban megszüntetem a kommentezést nem tölti fel a ddlEveket, ezek szerint rá sem fut az Evekfelt() eljárásra.
    Mindegy, hogy a dropdown listán ki vagy be van kapcsolva a postback.
    Gombot is felraktam.
    Mutasd a teljes hozzászólást!
  • Morzelnek
    Adtam neki EnableViewState=true-t de a helyzet változatlan, vagyis üres a ddlEvek.
    Csak a fenti kód van az egész lapon.
    Mi lehet mögötte?
    Mutasd a teljes hozzászólást!
  • Annak mindenképpen vissza kéne töltenie, azt ellenőrizted, érzékeli, hogy postback volt?
    Mutasd a teljes hozzászólást!
  • Végig gyalogoltam egy breakpoint után a
    if (!Page.IsPostBack)
    * {
    Evekfelt();
    }

    *- hoz rakva a break pointot nem ment bele.
    A dropdown list nem lett feltöltve.

    Az nem szólhat bele, hogy web user control lapról van szó?
    A web formon simán müködik.
    Mutasd a teljes hozzászólást!
  • Postback után nem is kell, hogy belemenjen, de a listában benne kellene legyenek az elemek.

    Szerintem a usercontrol nem lehet baja, gondolom egy webformnak adtad meg a user controll-t.

    Esetleg biztos ami biztos alapon egy IIS restart-ot bepróbálnék.
    Mutasd a teljes hozzászólást!
  • Hello!

    A dinamikusan hozzáadott elemek az oldalbetöltések között nem őrződnek meg. Ezért van az, hogy a Page_Loadban megint újra hozzá kell adni őket a kollekcióhoz.

    Két megoldás van
    1. Ha csak az itt felsorol elemeket fogod használni, akkor a tedd őket a markupba.
    Valahogy így (példa MSDN-ről):
    <asp:DropDownList id="ColorList" AutoPostBack="True" OnSelectedIndexChanged="Selection_Change" runat="server"> <asp:ListItem Selected="True" Value="White"> White </asp:ListItem> <asp:ListItem Value="Silver"> Silver </asp:ListItem> <asp:ListItem Value="DarkGray"> Dark Gray </asp:ListItem> <asp:ListItem Value="Khaki"> Khaki </asp:ListItem> <asp:ListItem Value="DarkKhaki"> Dark Khaki </asp:ListItem> </asp:DropDownList>

    2. Használj adatkötést:
    Az Evekfelt eljárás belsejében az elemeidet bepakolod valamilyen kollekcióba (mondjuk List, vagy Dictionary). Ezek után Bindolod

    ddlEvek.DataSource = kollekcio; ddlEvek.DataBind();
    Szerk.
    Amit elfejtettem DataBind() előtt valamikor nem árt megadni a ddl.DataTextField és DataValueField propertyket.

    Ebben az esetben kapcsold vissza a IsPostBack ellenőrzését, mert itt az oldalbetöltések között megmaradnak az elemek.

    Szerk.: hasznos link hasznos példákkal DropDownList Web Server Control Declarative Syntax
    Mutasd a teljes hozzászólást!
  • Mindkettő megoldást kipróbáltam már de egyikkel sem jött össze a dolog.

    Köszi linket nézem.

    Valaki nem tudna küldeni egy komplett működő progit (markup-ot és codebehindet is), ami egy webusercontroll oldalra van felrakva ?
    Olyan kellene ami az gépeden fut, mert én már azon kezdek gondolkodni hogy a gépemmel van valami vagy a Visual Studio2010-el.

    Köszi
    Mutasd a teljes hozzászólást!
  • Azt elfelejtettem mondani, hogy az első esetben nem kell a feltöltő eljárásod, csak a markup AutoPostBack="true" -val és a SelectedIndexChanged.

    Nézd át alaposabban.

    Nem szokásom más helyett kódot írni, de ha ennyire nem megy, itt egy kis bemutató:

    ascx markup:
    <asp:DropDownList runat="server" ID="ddlColors1" AutoPostBack="true" onselectedindexchanged="ddlColors_SelectedIndexChanged"> <asp:ListItem Text="Green" Value="green"/> <asp:ListItem Text="Red" Value="red"/> </asp:DropDownList> <br /> <asp:DropDownList runat="server" ID="ddlColors2" AutoPostBack="true" onselectedindexchanged="ddlColors_SelectedIndexChanged"> </asp:DropDownList> <br /> <asp:TextBox runat="server" ID="tbColor"/>

    CodeBehind:

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Feltolt(); } } protected void Feltolt() { Dictionary<string, string> d = new Dictionary<string, string>(); d.Add("green", "Green"); d.Add("red", "Red"); ddlColors2.DataSource = d; ddlColors2.DataTextField = "Value"; ddlColors2.DataValueField = "Key"; ddlColors2.DataBind(); } protected void ddlColors_SelectedIndexChanged(object sender, EventArgs e) { if (sender is DropDownList) { DropDownList d = (DropDownList)sender; tbColor.Text = d.ID + " " + d.SelectedValue; } }

    Ne tévesszen meg, hogy mindkettőnek ugyanaz a selectedindexchanged event handlere, az csak azért van mert lusta voltam többet gépelni
    Mutasd a teljes hozzászólást!
  • Hali!
    Köszi a segítséget és csak azt szerettem volna ha valamelyik másik gépen működő programot tudjak kipróbálni.

    Sajnos így sem működik, de este kipróbálom egy teljesen új programon. Eddig egy meglévőbe próbáltam beilleszteni.
    A
    protected void ddlColors_SelectedIndexChanged(object sender, EventArgs e)
    { * ide raktam egy breakpointot kiválasztottam a red színt de nem jutott idáig futás közben.
    Köszi
    Mutasd a teljes hozzászólást!
  • Hűha, itt akkor komolyabb dolgok lesznek, mert ez nálam működött, pont azért küldtem el.
    Mutasd a teljes hozzászólást!
  • Hali!
    Csináltam egy teljese új web site-ot és teljesen jól működik.
    Kezdem nézni az eredeti web site-ot, hogy ott miért nem megy .
    Köszi a segítséget!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd