Jak programově vytvářet a používat seznam políček z ASP.NET?

hlasů
4

Mám stránky s tabulkou věcí a musím umožnit uživateli vybrat řádky ke zpracování. Já jsem přišel na to, jak přidat sloupec políček do tabulky, ale nemůžu přijít na to, jak otestovat, zda jsou při odeslání formuláře zkontrolovat. Pokud by byly statické prvky, byl bych schopen jen zkontrolovat dělat, this.theCheckBoxale jsou generovány programaticly.

Také nejsem s tím, jak jsem připojování mých osobních údajů, které jim (o nádivkou ji tam vlastnost ID) velmi spokojen.

Nejsem si jistý, jestli je to důležité, ale já jsem při pohledu na trochu chyt-22, jak musím známo, který z políček, které byly vytvořeny naposledy kolem byly kontrolovány, než budu moci znovu spustit kód, který je vytvořil.


Edit: Našel jsem skoro řešení. Nastavením AutoPostBackvlastnosti a CheckedChangedudálosti:

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

Mohu získat kód, který se nazývá na příspěvek Návrat z jakéhokoliv políčka, která se změnila. Nicméně to má dva problémy:

  • Zpětné volání je zpracováno po (nebo v jeho průběhu, nejsem si jistý) Page_Load, kde musím použít tuto informaci
  • Zpětné volání není volána k políček, které byly zkontrolovány při načtení stránky a stále jsou.

Edit 2:

To, co jsem skončil dělat byl značkování všechny své id s know předponou a nacpal to v horní části Form_Load:

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

vše ostatní se zdá být pozdě.

Položena 24/07/2009 v 23:16
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
1

Nejprve se ujistěte, že každý Checkbox má ID, a že to má na ‚runat =‚server‘‘ ve značce.

pak použijte funkci FindControl (), aby ho najít.

Například, pokud jste průchozí všech řádků v GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Odpovězeno 24/07/2009 v 23:44
zdroj uživatelem

hlasů
2

Budu předpokládat, že používáte DataList, ale to by mělo pracovat a ovládání, které lze templated. Jsem také bude předpokládat, že používáte 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>

Code Behind:

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);                
        }
    }
}
Odpovězeno 25/07/2009 v 00:56
zdroj uživatelem

hlasů
0

Váš příspěvek je poněkud vágní. To by pomohlo vidět, jak jste přidání ovládacích prvků do tabulky. Je to ASP: Tabulka nebo pravidelné HTML tabulky (pravděpodobně s runat = „server“ atribut, protože jste úspěšně přidali položky do ní)?

Pokud máte v úmyslu, aby uživatel udělat spoustu výběrů, pak hit tlačítko „Odeslat“, načež budete zpracovat každý řádek, na jejímž základě řádek je zaškrtnuto, pak byste neměli být zpracování události CheckChanged. Jinak, jak jste si všimli, budete způsobuje postback pokaždé, a to nebude zpracovávat na kteroukoli další políček. Takže při vytváření CheckBox nenastavíte EventHandler tak to nezpůsobí zpětného odeslání.

V EventHandler vašeho tlačítko Odeslat to byste procházet každý řádek tabulky, buňka, pak zjistit, zda kontrola děti buňky obsahovaly políčko.

Navrhoval bych to pomocí tabulky. Z toho, co jste popisující možná si GridView nebo DataList je lepší volba.


EDIT: Zde je jednoduchý příklad demonstrovat. Měli byste být schopni se dostat tuto práci na novém projektu vyzkoušet.

Markup

    <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>

Kódem na pozadí

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 />");
                    }
                }
            }
        }
    }
}
Odpovězeno 25/07/2009 v 00:58
zdroj uživatelem

hlasů
1

Postback obnovením dat mezi událostí InitComplete a událostí předpětím. Pokud vaše políčka nejsou vytvořeny až později pak políčka budou hrát „dohnat“ se svými událostmi a data bude načten do ovládacího prvku krátce poté, co je vytvořen.
Pokud je to pozdě pro vás, pak budete muset udělat něco, co už dělají. Že je budete mít přístup k údajům o příspěvek před podáním ke kontrole.
Pokud si může zachránit UniqueIdkaždého CheckBox, které vytvoříte poté může přímo přistupovat k datům na post, aniž by bylo nutné vzhledem k jejich speciální prefix. Dalo by se to tím, že vytvoří seznam řetězců, které můžete uložit ID v jak si vygenerovat a uložit je do stavu zobrazení. Samozřejmě, že vyžaduje stav zobrazení, které mají být povoleny a zabírá více místa v ViewState.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Odpovězeno 27/07/2009 v 21:56
zdroj uživatelem

hlasů
0

Co používáte CheckBoxList kontrolu? Nemám Visual Studio otevře dnes, ale pokud si vzpomínám, že je ovládací prvek DataBound, které poskytují DataSource, a DataBind()kde si můžete vytvořit seznam za běhu. Je-li strana dělá zpětného odeslání můžete procházet seznam voláním něco podobného myCheckBoxList.Itemsa zkontrolujte, zda je aktuální položka je vybrána voláním ListItem.Selectedmetody. To by mělo fungovat.

Odpovězeno 27/07/2009 v 22:03
zdroj uživatelem

hlasů
0

Přidejte je v vynechání způsobu CreateChildControls stránky. Ujistěte se, že dát jim číslo! Tímto způsobem se dostanou přidáno do stromu ovládací prvek ve správný čas.

IMHO nejlepší způsob, jak by bylo použít DataBound templated Control však, tedy něco jako ListView (v .NET 3.5). pak pageLoad po zpětné odeslání projít všechny položky v ovládacím prvku databound a používat item.FindControl se dostat na aktuální políčko.

Odpovězeno 27/07/2009 v 22:03
zdroj uživatelem

hlasů
0

To, co jsem skončil dělat byl značkování všechny své id s know předponou a nacpal to v horní části Form_Load:

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

vše ostatní se zdá být pozdě.

Odpovězeno 23/08/2009 v 23:05
zdroj uživatelem

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