Cum de a crea programatic și de a folosi o listă de casete de selectare din ASP.NET?

voturi
4

Am o pagină cu un tabel de lucruri și am nevoie pentru a permite utilizatorului să selecteze rânduri pentru a procesa. M - am dat seama cum să adăugați o coloană de casete de selectare la masă , dar pare că nu pot să dau seama cum de a testa dacă acestea sunt verificate atunci când formularul este depus. Dacă ar fi elemente statice, aș fi în stare să verifice doar face , this.theCheckBoxdar acestea sunt generate programaticly.

De asemenea, nu sunt foarte fericit cu modul în care atașez datele mele pentru a le (de umplutura in imobil ID).

Nu sunt sigur dacă este relevant , dar mă uit la un pic de o captura-22 așa cum am nevoie să știe care dintre casetele de selectare care au fost create ultima dată în jurul au fost verificate înainte de a putea re-rula codul pe care le -a creat.


Editare: Am găsit o soluție aproape. Prin setarea AutoPostBackproprietății și CheckedChangedevenimentul:

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

Pot obține codul să fie numit pe un post din spate pentru orice casetă de validare care sa schimbat. Totuși, acest lucru are două probleme:

  • Apelul din spate este procesată după (sau în timpul, nu sunt sigur) , în Page_Loadcazul în care am nevoie pentru a utiliza aceste informații
  • Apelul din spate nu este chemat pentru casetele de selectare care au fost verificate atunci când pagina încărcată și încă sunt.

Edit 2:

Ceea ce am ajuns să fac a fost etichetați toate lui ID - ul meu cu un prefix și știu acest lucru umplutura la partea de sus a Form_Load:

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

totul pare să ruleze până la sfârșitul lunii.

Întrebat 24/07/2009 la 23:16
sursa de către utilizator
În alte limbi...                            


7 răspunsuri

voturi
1

În primul rând, asigurați-vă că fiecare casetă de selectare are un ID și că este luat „Runat =«server»“ în etichetă.

apoi utilizați funcția FindControl () să-l găsească.

De exemplu, dacă looping prin toate rândurile dintr-un GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Publicat 24/07/2009 la 23:44
sursa de către utilizator

voturi
2

Voi presupune că utilizați un datalist, dar acest lucru ar trebui să lucreze cu și de control, care pot fi templated. Sunt de asemenea, va presupune că utilizați DataBinding.

Cod frontal:

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

Cod spatele:

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);                
        }
    }
}
Publicat 25/07/2009 la 00:56
sursa de către utilizator

voturi
0

Postarea dvs. este un pic vag. Aceasta ar ajuta să vedem cum te adăugarea de controale la masă. Este o ASP: Tabelul sau un tabel HTML obișnuit (probabil cu un Runat = atribut „server“ de când ați adăugat cu succes elemente să-l)?

Dacă intenționați să lăsați utilizatorul face o grămadă de selecții, apoi a lovit un buton „Submit“, după care va procesa fiecare rând pe baza căruia rând este bifată, atunci ar trebui să nu fie de manipulare eveniment CheckChanged. În caz contrar, după cum ați observat, vei produce o postback de fiecare dată și nu va procesa oricare dintre celelalte casetele de selectare. Deci, atunci când creați caseta de selectare nu setați eventhandler astfel încât să nu provoace o postback.

În eventhandler butonul submit te va bucla prin fiecare rând de tabel, celula, apoi determina dacă celulele de control copii conținea o casetă de selectare.

Aș sugera să nu utilizați un tabel. Din ceea ce descrie, probabil, o GridView sau datalist este o opțiune mai bună.


EDIT: aici este un exemplu simplu pentru a demonstra. Tu ar trebui să poată obține acest lucru într - un nou proiect pentru a testa.

Marcaj

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

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 />");
                    }
                }
            }
        }
    }
}
Publicat 25/07/2009 la 00:58
sursa de către utilizator

voturi
1

Datele de finalizare a achiziției este restabilită între evenimentul InitComplete și evenimentul de încărcare anticipată. În cazul în care casetele dvs. nu sunt create până mai târziu , atunci casetele de selectare va juca „prinde din urmă“ cu evenimentele lor , iar datele vor fi încărcate în controlul la scurt timp după ce a fost creat.
În cazul în care acest lucru este de a târziu pentru tine , atunci va trebui să facă ceva de genul ceea ce fac deja. Asta este , va trebui să acceseze datele post înainte de a fi dat la control.
Dacă aveți posibilitatea să salvați UniqueIdde fiecare pe CheckBoxcare le creați , atunci se poate accesa direct datele poștale , fără a fi nevoie să le -a dat un prefix special. Ai putea face acest lucru prin crearea unei liste de siruri de caractere pe care le salvați ID - uri , în timp ce le generează și apoi le salvați în starea de vizualizare. Desigur că impune statului pentru a fi activată și ocupă mai mult spațiu în Viewstate.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Publicat 27/07/2009 la 21:56
sursa de către utilizator

voturi
0

Ce despre utilizarea CheckBoxList de control? Nu am nici Visual Studio deschide acum, dar în măsura în care îmi amintesc că este un control DataBound, oferind DataSourceși în DataBind()cazul în care vă poate oferi o listă în timpul rulării. Atunci când pagina face un postback puteți parcurge lista de asteptare ceva de genul myCheckBoxList.Itemsși verificați dacă elementul curent este selectat prin apelarea ListItem.Selectedmetodei. Acest lucru ar trebui să funcționeze.

Publicat 27/07/2009 la 22:03
sursa de către utilizator

voturi
0

Adăugați-le într-o suprareglare a metodei CreateChildControls a paginii. Asigurați-vă că pentru a le da un act de identitate! Astfel, ei se adaugă la arborele de control la momentul corect.

IMHO Cel mai bun mod ar fi utilizarea DataBound urile șablon de control , deși, adică ceva de genul un ListView (în .NET 3.5). apoi , în după postback traversa Căile toate articolele din controlul databound și de a folosi item.FindControl pentru a ajunge la caseta actuale.

Publicat 27/07/2009 la 22:03
sursa de către utilizator

voturi
0

Ceea ce am ajuns să fac a fost etichetați toate lui ID - ul meu cu un prefix și știu acest lucru umplutura la partea de sus a Form_Load:

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

totul pare să ruleze până la sfârșitul lunii.

Publicat 23/08/2009 la 23:05
sursa de către utilizator

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