Hoe programmatisch maken en gebruiken een lijst met selectievakjes van ASP.NET?

stemmen
4

Ik heb een pagina met een lijst van dingen en ik moet de gebruiker toestaan om de rijen te verwerken selecteren. Ik heb bedacht hoe een kolom van selectievakjes toe te voegen aan de tafel, maar ik kan niet schijnen om erachter te komen hoe om te testen of zij worden gecontroleerd wanneer het formulier wordt ingediend. Als ze statische elementen, zou ik in staat zijn om gewoon te controleren doen this.theCheckBox, maar ze zijn programaticly gegenereerd.

Ook ben ik niet erg blij met hoe ik het bevestigen van mijn gegevens aan hen (door de vulling er ID eigendom).

Ik weet niet zeker of het relevant is, maar ik ben op zoek naar een beetje een catch-22 als ik moet bekend zijn welke van de vakjes die zijn gemaakt vorige keer werden gecontroleerd voordat ik kan re-run de code waarin ze zijn gemaakt.


Edit: Ik heb een bijna gevonden oplossing. Door het instellen van de AutoPostBackeigendom en het CheckedChangedevenement:

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

Ik kan krijgen code genoemd te worden op een post terug voor een vakje dat is veranderd. Dit heeft echter twee problemen:

  • Het terugbellen wordt verwerkt na (of tijdens, ik ben niet zeker) Page_Loadwaar ik moet deze informatie gebruiken
  • Het terugbellen wordt niet opgeroepen voor selectievakjes die werden gecontroleerd wanneer de pagina geladen en nog steeds zijn.

Probleem 2:

Wat ik uiteindelijk doen was tagging al mijn ID's met een betweter prefix en vullen deze aan de bovenkant van Form_Load:

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

alles lijkt te laat lopen om.

De vraag is gesteld op 24/07/2009 om 23:16
bron van user
In andere talen...                            


7 antwoorden

stemmen
1

Zorg er eerst voor dat elke Checkbox heeft een ID, en dat het heeft de 'runat = 'server'' in de tag.

dan gebruik maken van de functie FindControl () om het te vinden.

Bijvoorbeeld, als je het doorlopen van alle rijen in een GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
antwoordde op 24/07/2009 om 23:44
bron van user

stemmen
2

Ik ga ervan uit dat u gebruik maakt van een DataList maar dit zou moeten werken met en controle die kunnen worden templated. Ik ben ook gaan om te veronderstellen dat u gebruikt DataBinding.

Code Voor:

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

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);                
        }
    }
}
antwoordde op 25/07/2009 om 00:56
bron van user

stemmen
0

Je post is een beetje vaag. Het zou helpen om te zien hoe u de controles toevoegt aan de tafel. Is het een ASP: Table of een gewone HTML-tabel (vermoedelijk met een runat = "server" attribuut, omdat je hebt met succes items aan toegevoegd)?

Als u van plan bent te laten de gebruiker een heleboel selecties te maken, sloeg vervolgens een knop "Verzenden", waarna u elke rij zult proces op basis van welke rij wordt gecontroleerd, dan moet je niet de behandeling van de CheckChanged evenement. Anders, als je hebt gemerkt, zult u het veroorzaken van een postback elke keer en het zal niet een van de andere vakjes te verwerken. Dus als u het hokje niet de eventhandler niet ingesteld, zodat het niet een postback veroorzaakt creëren.

In eventhandler uw submit knop u zou lus door elke tabel rij, cel, dan bepalen of de cel van de kinderen controle bevatte een checkbox.

Ik stel niet met behulp van een tabel. Van wat je misschien je beschrijft een GridView of DataList is een betere optie.


EDIT: hier is een simpel voorbeeld om aan te tonen. Je moet in staat zijn om dit werkend te krijgen in een nieuw project uit te testen.

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 achter

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 />");
                    }
                }
            }
        }
    }
}
antwoordde op 25/07/2009 om 00:58
bron van user

stemmen
1

Postback data wordt hersteld tussen de Initcomplete gebeurtenis en de PreLoad event. Als uw vakjes niet worden gemaakt tot later dan de selectievakjes zal spelen "inhalen" met hun evenementen en de gegevens worden in de besturing kort nadat het is gemaakt worden geladen.
Als dit is te laat voor u dan moet je iets wat je al aan het doen zijn te doen. Dat is dat je zal moeten toegang tot de post data voordat deze wordt gegeven aan de controle.
Als u het kunt opslaan UniqueIdvan elk CheckBoxdie u maakt, dan kan direct de post toegang te krijgen zonder dat hun een speciale prefix. U kunt dit doen door het creëren van een lijst van strings waarin u de id's op te slaan in als je ze genereren en vervolgens op te slaan ze in het zicht staat. Natuurlijk is dat het zicht staat te zijn ingeschakeld nodig heeft en neemt meer ruimte in de viewstate.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
antwoordde op 27/07/2009 om 21:56
bron van user

stemmen
0

Hoe zit het met het gebruik van de CheckBoxList controle? Ik heb geen Visual Studio te openen nu, maar voor zover ik herinner me dat het een Databound controle, het verstrekken DataSourceen DataBind()waar u kunt een lijst te verstrekken tijdens de uitvoering. Wanneer de pagina doet een postback kunt u de lijst doorlopen door iets als het roepen myCheckBoxList.Itemsen controleer of het huidige item wordt geselecteerd door te bellen ListItem.Selectedmethode. Dit zou moeten werken.

antwoordde op 27/07/2009 om 22:03
bron van user

stemmen
0

Voeg ze toe in een vervanging van de methode CreateChildControls van de pagina. Zorg ervoor dat ze een ID aan te geven! Op deze manier krijgen ze toegevoegd aan de controle boom op het juiste moment.

IMHO De beste manier zou zijn om Databound gebruiken Templated Controle hoewel, dat wil zeggen iets als een ListView (in .NET 3.5). dan in pageLoad na postback doorkruisen alle items in de datagebonden controle en gebruik item.FindControl naar de werkelijke vakje te krijgen.

antwoordde op 27/07/2009 om 22:03
bron van user

stemmen
0

Wat ik uiteindelijk doen was tagging al mijn ID's met een betweter prefix en vullen deze aan de bovenkant van Form_Load:

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

alles lijkt te laat lopen om.

antwoordde op 23/08/2009 om 23:05
bron van user

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