Come creare e utilizzare un elenco di caselle di controllo da ASP.NET?

voti
4

Ho una pagina con una tabella di roba e ho bisogno per consentire all'utente di selezionare righe da elaborare. Ho capito come aggiungere una colonna di caselle di controllo per il tavolo, ma io non riesco a capire come verificare se sono controllati quando il modulo viene inviato. Se fossero elementi statici, sarei in grado di controllare solo fare this.theCheckBoxma sono programaticly generato.

Anche io non sono molto contento di come sto allegando i miei dati a loro (da ripieno in là proprietà ID).

Io non sono sicuro se è rilevante, ma sto guardando un po 'di un catch-22 come ho bisogno di conoscere quale delle caselle di controllo che sono stati creati l'ultima volta intorno sono state controllate prima di poter ri-eseguire il codice che li ha creati.


Edit: ho trovato quasi soluzione. Impostando la AutoPostBackproprietà e la CheckedChangedmanifestazione:

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

Posso ottenere il codice di essere chiamato su un palo qualsiasi casella di controllo che ha cambiato per. Tuttavia, questo ha due problemi:

  • La chiamata viene elaborato dopo (o durante, non sono sicuro) Page_Loadin cui ho bisogno di usare queste informazioni
  • La chiamata non viene chiamato per le caselle di controllo che sono stati controllati quando la pagina caricata e sono tuttora.

Edit 2:

Quello che ho finito per fare stava codifica tutte le mie identità di con un prefisso conoscere e ripieno questo in cima Form_Load:

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

tutto il resto sembra correre a tardi.

È pubblicato 24/07/2009 alle 23:16
fonte dall'utente
In altre lingue...                            


7 risposte

voti
1

In primo luogo, assicurarsi che ogni casella di controllo ha un ID e che è ottenuto il 'runat = 'server'' nel tag.

quindi utilizzare la funzione FindControl () per trovarlo.

Ad esempio, se si sta scorrendo tutte le righe in un GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Risposto il 24/07/2009 a 23:44
fonte dall'utente

voti
2

Ho intenzione di assumere che si sta utilizzando un DataList ma questo dovrebbe lavorare e di controllo che può essere templato. Ho anche intenzione di assumere che si sta utilizzando DataBinding.

Codice anteriore:

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

Codice Dietro:

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);                
        }
    }
}
Risposto il 25/07/2009 a 00:56
fonte dall'utente

voti
0

Il tuo post è un po 'vago. Sarebbe utile per vedere come si sta aggiungendo controlli al tavolo. È un ASP: tabella o una tabella HTML regolare (presumibilmente con un attributo runat = "server" visto che hai aggiunto con successo gli elementi ad esso)?

Se avete intenzione di permettere all'utente di fare una serie di selezioni, poi ha colpito un pulsante "Invia", dopo di che si elaborare ogni riga sulla base di quale riga è selezionata, allora non dovrebbe essere la gestione dell'evento CheckChanged. In caso contrario, come avete notato, sarete causando un postback ogni volta e non sarà elaborare una qualsiasi delle altre caselle di controllo. Così, quando si crea il CheckBox non impostare l'EventHandler in modo da non causare un postback.

In EventHandler del pulsante di invio si ciclo attraverso ogni riga della tabella, cella, quindi determinare se il controllo dei bambini della cellula conteneva una casella di controllo.

Vorrei suggerire di non utilizzare una tabella. Da quello che stai descrivendo forse un GridView o DataList è una scelta migliore.


EDIT: Ecco un semplice esempio per dimostrare. Si dovrebbe essere in grado di ottenere questo lavoro in un nuovo progetto per testare.

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>

Code-behind

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 />");
                    }
                }
            }
        }
    }
}
Risposto il 25/07/2009 a 00:58
fonte dall'utente

voti
1

Dati di postback viene ripristinato tra l'evento e l'evento InitComplete precarico. Se i vostri caselle di controllo non sono creati fino a tardi quindi le caselle di controllo giocheranno "recuperare" con i loro eventi ed i dati saranno caricati nel controllo poco dopo la sua creazione.
Se questo è troppo tardi per voi allora si dovrà fare qualcosa di simile a ciò che si sta già facendo. Cioè si dovrà accedere ai dati post prima di essere data al controllo.
Se è possibile salvare il UniqueIddi ogniCheckBoxche si crea quindi può accedere direttamente ai dati di post senza dover dato loro un prefisso speciale. Si potrebbe fare questo attraverso la creazione di una lista di stringhe che si salva gli ID di come li si genera e poi salvarli in stato di visualizzazione. Naturalmente, che richiede lo stato di visualizzazione da abilitare e occupa più spazio nel ViewState.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Risposto il 27/07/2009 a 21:56
fonte dall'utente

voti
0

Cosa succede ad usare il CheckBoxList controllo? Non ho Visual Studio Aperto ora, ma per quanto mi ricordo che è un controllo DataBound, fornendo DataSourcee DataBind()dove è possibile fornire un elenco in fase di esecuzione. Quando la pagina fa un postback si può attraversare la lista chiamando qualcosa di simile myCheckBoxList.Itemse controllare se l'elemento corrente è selezionata chiamando il ListItem.Selectedmetodo. Questo dovrebbe funzionare.

Risposto il 27/07/2009 a 22:03
fonte dall'utente

voti
0

Aggiungere loro in un override del metodo CreateChildControls della pagina. Essere sicuri di dare loro un ID! In questo modo essi vengono aggiunti alla struttura dei controlli al momento giusto.

IMHO Il modo migliore sarebbe quella di utilizzare DataBound su modelli di controllo , però, vale a dire qualcosa di simile a un controllo ListView (in .NET 3.5). poi nel pageload dopo il postback attraversare tutti gli elementi nel controllo databound e utilizzare item.FindControl per arrivare alla casella di controllo vero e proprio.

Risposto il 27/07/2009 a 22:03
fonte dall'utente

voti
0

Quello che ho finito per fare stava codifica tutte le mie identità di con un prefisso conoscere e ripieno questo in cima Form_Load:

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

tutto il resto sembra correre a tardi.

Risposto il 23/08/2009 a 23:05
fonte dall'utente

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