Comment créer et utiliser une programmation liste des cases de ASP.NET?

voix
4

J'ai une page avec une table de choses et je dois permettre à l'utilisateur de sélectionner les lignes à traiter. J'ai compris comment ajouter une colonne de cases à cocher à la table , mais je ne peux pas sembler comprendre comment tester si elles sont vérifiées lorsque le formulaire est soumis. Si elles étaient des éléments statiques, je serais capable de faire vérifier simplement this.theCheckBoxmais ils sont programaticly accumulés .

Aussi je ne suis pas très heureux avec la façon dont j'attacher mes données pour les (en bourrant dans une propriété là-ID).

Je ne sais pas si elle est pertinente , mais je regarde un peu un fourre-22 que je dois connaître que des cases qui ont été créés dernière fois , ont été vérifiés avant que je puisse re-exécuter le code qui les a créés.


Edit: J'ai trouvé une solution presque. En définissant la AutoPostBackpropriété et l' CheckedChangedévénement:

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

Je peux obtenir le code à appeler sur un poste de retour pour une case à cocher qui a changé. Cependant, cela a deux problèmes:

  • L'appel est traité de retour après (ou pendant, je ne suis pas sûr) Page_Loadoù je dois utiliser cette information
  • L'appel n'est pas rappelé pour les cases à cocher qui ont été vérifiés lorsque la page chargée et encore.

Edit 2:

Ce que je fini par faire était de marquage tous mes identifiants avec un préfixe savoir et la farce ce en haut de Form_Load:

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

tout le reste semble fonctionner à la fin.

Créé 24/07/2009 à 23:16
source utilisateur
Dans d'autres langues...                            


7 réponses

voix
1

Tout d'abord, assurez-vous que chaque case à cocher a un ID et qu'il a le « runat = « server » » dans la balise.

puis utilisez la fonction FindControl () pour le trouver.

Par exemple, si vous en boucle toutes les lignes dans un GridView ..

foreach(GridViewRow r in Gridview1.Rows)
{

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

}
Créé 24/07/2009 à 23:44
source utilisateur

voix
2

Je vais supposer que vous utilisez un DataList mais cela devrait fonctionner avec et de contrôle qui peuvent être templated. Je vais aussi supposer que vous utilisez DataBinding.

Code avant:

<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 Derrière:

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);                
        }
    }
}
Créé 25/07/2009 à 00:56
source utilisateur

voix
0

Votre message est un peu vague. Il serait utile de voir comment vous ajoutez des contrôles à la table. Est-ce un ASP: table ou une table HTML régulière (probablement avec un attribut runat = « server » puisque vous avez des éléments ajoutés avec succès à elle)?

Si vous avez l'intention de laisser l'utilisateur faire un tas de sélections, puis appuyez sur un bouton « Soumettre », après quoi vous traiter chaque ligne sur la base duquel la ligne est cochée, alors vous ne devriez pas traiter l'événement CheckChanged. Sinon, comme vous l'avez remarqué, vous causer un postback chaque fois et il ne traitera aucune des autres cases à cocher. Donc, lorsque vous créez le CheckBox ne définissez pas le eventhandler donc il ne provoque pas de postback.

Dans votre soumettre le eventhandler de bouton vous boucle à travers chaque ligne de la table, la cellule, puis déterminer si le contrôle des enfants de la cellule contenait une case à cocher.

Je suggère de ne pas utiliser une table. D'après ce que vous décrivez peut-être un GridView ou DataList est une meilleure option.


EDIT: voici un exemple simple de démontrer. Vous devriez être en mesure d'obtenir ce travail dans un nouveau projet pour tester.

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 />");
                    }
                }
            }
        }
    }
}
Créé 25/07/2009 à 00:58
source utilisateur

voix
1

Données Postback est rétablie entre l'événement et l'événement InitComplete de préchargement. Si vos cases ne sont pas créés plus tard , puis les cases à cocher jouer « rattraper » leurs événements et les données seront chargées dans le contrôle peu après sa création.
Si c'est à la fin pour vous , alors vous devrez faire quelque chose comme ce que vous faites déjà. C'est que vous devrez accéder aux données de poste avant qu'il ne soit donnée au contrôle.
Si vous pouvez enregistrer UniqueIdchaque CheckBoxque vous créez peut alors accéder directement aux données de poste sans avoir à leur donner un préfixe spécial. Vous pouvez le faire en créant une liste de chaînes que vous enregistrez les ids en tant que vous les générer, puis de les enregistrer dans l'état d'affichage. Bien sûr , cela nécessite l'état d'affichage doit être activé et prend plus de place dans le viewstate.

foreach (string uniqueId in UniqueIds)
{
    bool data = Convert.ToBoolean(Request.Form[uniqueId]);
    //...
}
Créé 27/07/2009 à 21:56
source utilisateur

voix
0

Qu'en est- il en utilisant le CheckBoxList contrôle? Je n'ai pas Visual Studio ouvrir maintenant, mais pour autant que je me souviens qu'il est un contrôle DataBound, fournissant DataSourceet DataBind()où vous pouvez fournir une liste lors de l' exécution. Lorsque la page ne postback vous pouvez parcourir la liste en appelant quelque chose comme myCheckBoxList.Itemset vérifier si l'élément en cours est sélectionné en appelant la ListItem.Selectedméthode. Cela devrait fonctionner.

Créé 27/07/2009 à 22:03
source utilisateur

voix
0

Ajoutez-les dans une substitution de la méthode CreateChildControls de la page. Assurez-vous de leur donner une carte d'identité! De cette façon, ils sont ajoutés à l'arbre de commande au bon moment.

À mon humble avis la meilleure façon serait d'utiliser DataBound Templated contrôle si, à savoir quelque chose comme un ListView (.NET 3.5). puis à pageload après la publication Parcourt tous les éléments dans le contrôle et l' utilisation databound item.FindControl pour obtenir à la case réelle.

Créé 27/07/2009 à 22:03
source utilisateur

voix
0

Ce que je fini par faire était de marquage tous mes identifiants avec un préfixe savoir et la farce ce en haut de Form_Load:

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

tout le reste semble fonctionner à la fin.

Créé 23/08/2009 à 23:05
source utilisateur

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