Hogyan programozottan létrehozása és használata listáját jelölőnégyzeteket ASP.NET?

szavazat
4

Van egy oldal, egy asztal dolgot, és azt kell, hogy a felhasználó kiválaszthatja sorok feldolgozni. Már kitaláltam, hogyan lehet hozzáadni oszlopon négyzeteket az asztalra, de nem úgy tűnik, hogy kitaláljuk, hogyan lehet tesztelni, ha azokat ellenőrizték, amikor az űrlap elküldésekor. Ha ők statikus elemek, képes leszek, hogy csak ellenőrizni csinálni this.theCheckBox, de ezek programaticly keletkezett.

Szintén nem vagyok elégedett azzal, ahogy én fűződő adataimat őket (tölteléket, hogy ott tulajdonság).

Nem vagyok biztos benne, hogy megfelelő, de én néztem egy kicsit a 22-es csapdája, ahogy kell ismert, amely a négyzeteket, hogy jött létre a múlt alkalommal ellenőrizték, mielőtt újra futtatni a kódot, amely teremtette őket.


Edit: én találtam egy majdnem megoldást. Azáltal, hogy az AutoPostBackingatlanok és az CheckedChangedeseményt:

checkbox.AutoPostBack = false;
checkbox.CheckedChanged += new EventHandler(checkbox_CheckedChanged);

Tudok kódot, hogy hívják a postán vissza minden négyzetet, hogy megváltozott. Azonban ez a két probléma:

  • A visszahívás feldolgozása után (vagy alatt, nem vagyok benne biztos) Page_Load, ahol azt kell használni ezt az információt
  • A visszahívás nem hívott fel a négyzeteket, amelyek ellenőrizték, ha az oldal betöltődik, és még mindig vannak.

Szerkesztés 2:

Amit végül csinál volt címkézést az én ID-vel felszerelt, know előtagot és a töltelék ez a tetején Form_Load:

foreach (string v in this.Request.Form.AllKeys)
{
    if (v.StartsWith(Prefix))
    {
        var data = v.Substring(Prefix.Length);
    }
}

minden más úgy tűnik, hogy futni, hogy késő.

A kérdést 24/07/2009 23:16
a forrás felhasználó
Más nyelveken...                            


7 válasz

szavazat
1

Először is, győződjön meg arról, hogy az egyes négyzeteket van egy azonosítója, és ez van a „runat =»server«” a címke.

majd a FindControl () függvényt, hogy megtalálja.

Például ha átkötése minden sorában egy GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

    object cb = r.FindControl("MyCheckBoxId");
    if(r != null)
    {
      CheckBox chk = (CheckBox)cb;
      bool IsChecked = chk.Checked;
    }

}
Válaszolt 24/07/2009 23:44
a forrás felhasználó

szavazat
2

Megyek feltételezzük, hogy éppen egy DataList de ez működni, és ellenőrzi, hogy lehet sablonra. Én is megyek, hogy vállalja az Ön által használt DataBinding.

Kód Front:

<asp:DataList ID="List" OnItemDataBound="List_ItemDataBound" runat="server">
    <ItemTemplate>
        <asp:CheckBox ID="DeleteMe" runat="server"/>
        <a href="<%# DataBinder.Eval(Container, "DataItem.Url")%>" target="_blank">
            <%# DataBinder.Eval(Container, "DataItem.Title")%></a>
    </ItemTemplate>
</asp:DataList>
<asp:Button ID="DeleteListItem" runat="server" OnClick="DeleteListItem_Click" ></asp:Button>

Kód mögött:

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadList();
    }

    protected void DeleteListItem_Click(object sender, EventArgs e)
    {
        foreach (DataListItem li in List.Items)
        {
            CheckBox delMe = (CheckBox)li.FindControl("DeleteMe");

            if (delMe != null && delMe.Checked)
                    //Do Something
            }
        }

        LoadList();
    }

    protected void LoadList()
    {
        DataTable dt = //Something...
        List.DataSource = dt;
        List.DataBind();
    }

    protected void List_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
        {
            string id = DataBinder.Eval(e.Item.DataItem, "ID").ToString();
            CheckBox delMe = (CheckBox)e.Item.FindControl("DeleteMe");

            if (delMe != null)
                delMe.Attributes.Add("value", id);                
        }
    }
}
Válaszolt 25/07/2009 00:56
a forrás felhasználó

szavazat
0

Az üzenet egy kicsit homályos. Ez segítene, hogy hogyan adsz hozzá ellenőrzéseket az asztalra. Ez egy ASP: Táblázat vagy rendszeres HTML táblázat (feltehetően egy runat = „server” attribútum mióta sikeresen hozzáadott elemeket rá)?

Ha szándékában áll, hogy a felhasználó, hogy egy csomó választás, majd nyomja a „Küldés” gombra, majd akkor dolgozza fel az egyes sor, amely alapján sor van jelölve, akkor nem kell kezelni a CheckChanged esemény. Egyébként, mint azt veszi észre, akkor okoz postback minden egyes alkalommal, és nem fogja feldolgozni a másik dobozt. Tehát, ha létre CheckBox ne állítsa a eventHandler így nem okoz postback.

Az Ön benyújtja gomb eventHandler akkor végigjárjuk minden tábla sor, cella, majd meghatározza, hogy a sejt a gyerekek ellenőrzés tartalmazott négyzetet.

Azt javaslom, hogy ne használja a táblázatot. Attól, amit leírja talán egy GridView vagy DataList egy jobb lehetőség.


EDIT: itt egy egyszerű példa annak bizonyítására. Meg kell tudni, hogy ez a munka egy új projekt kipróbálni.

haszonkulcs

    <form id="form1" runat="server">
    <div>
    <table id="tbl" runat="server"></table>
    <asp:Button ID="btnSubmit" runat="server" Text="Submit"
      onclick="btnSubmit_Click" />
    </div>
    </form>

Code-mögött

protected void Page_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        var row = new HtmlTableRow();
        var cell = new HtmlTableCell();
        cell.InnerText = "Row: " + i.ToString();
        row.Cells.Add(cell);
        cell = new HtmlTableCell();
        CheckBox chk = new CheckBox() { ID = "chk" + i.ToString() };
        cell.Controls.Add(chk);
        row.Cells.Add(cell);
        tbl.Rows.Add(row);
    }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    foreach (HtmlTableRow row in tbl.Rows)
    {
        foreach (HtmlTableCell cell in row.Cells)
        {
            foreach (Control c in cell.Controls)
            {
                if (c is CheckBox)
                {
                    // do your processing here
                    CheckBox chk = c as CheckBox;
                    if (chk.Checked)
                    {
                        Response.Write(chk.ID + " was checked <br />");
                    }
                }
            }
        }
    }
}
Válaszolt 25/07/2009 00:58
a forrás felhasználó

szavazat
1

Postback adatok között helyreáll a InitComplete esemény és a preload esemény. Ha a négyzeteket nem jön létre, csak később, majd a négyzeteket fog játszani „felzárkózni” azok eseményeket, és az adatokat be lehet tölteni az ellenőrzés után rövid időn belül jön létre.
Ha ez a késő, akkor meg kell csinálni valamit, mint amit már most. Ez lesz hozzáférni a post adatokat, mielőtt kap az ellenőrzés.
Ha lehet menteni a UniqueIdminden CheckBox, hogy hozzon létre, akkor közvetlenül elérheti a post adatokat anélkül, hogy adott nekik egy speciális előtagot. Ehhez valójában létrehozásával sztringlistát amit menteni a azonosítókat ahogy generálni őket, majd megmenti őket a nézet állapotban. Persze, hogy előírja, hogy a néző állam engedélyezni kell, és több helyet foglal a Viewstate.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Válaszolt 27/07/2009 21:56
a forrás felhasználó

szavazat
0

Mi a helyzet a CheckBoxList szabályozás? Nincs Visual Studio nyitni most, de amennyire emlékszem, ez egy DataBound kontrollal DataSourceés DataBind()ahol lehet, hogy egy listát a futás során. Amikor az oldal nem egy postback akkor keresztezik a lista hívja valami hasonló myCheckBoxList.Items, és ellenőrizze, hogy a jelenlegi elem ki van választva hívja ListItem.Selectedmódszerrel. Ennek működnie kell.

Válaszolt 27/07/2009 22:03
a forrás felhasználó

szavazat
0

Add őket egy felülbírálja az CreateChildControls módszer az oldal. Figyeljen rá, hogy neki egy azonosító! Ily módon adhatjuk hozzá a vezérlő struktúra a megfelelő időben.

IMHO a legjobb módja az lenne, hogy DataBound Sablonra ellenőrző bár, tehát olyasmi, mint egy ListView (.NET 3.5). majd Oldalletöltések után postback áthalad az összes elem a databound ellenőrzési és használja item.FindControl hogy a tényleges jelölőnégyzetet.

Válaszolt 27/07/2009 22:03
a forrás felhasználó

szavazat
0

Amit végül csinál volt címkézést az én ID-vel felszerelt, know előtagot és a töltelék ez a tetején Form_Load:

foreach (string v in this.Request.Form.AllKeys)
{
    if (v.StartsWith(Prefix))
    {
        var data = v.Substring(Prefix.Length);
    }
}

minden más úgy tűnik, hogy futni, hogy késő.

Válaszolt 23/08/2009 23:05
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more