web-dev-qa-db-fra.com

Question ASP.NET CheckBoxList DataBinding

Est-il possible de DataBind un Check.BoxList ASP.NET de telle sorte qu'une valeur de chaîne dans les données devient l'étiquette de la case à cocher et qu'une valeur bool vérifie/désélectionne la case?

Sur mon formulaire Web asp.net, j'ai un CheckBoxList comme celui-ci:

<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" />

Dans le code derrière j'ai ce code:

var usersInRole = new List<UserInRole> 
{ 
  new UserInRole { UserName = "Frank", InRole = false},
  new UserInRole{UserName = "Linda", InRole = true},
  new UserInRole{UserName = "James", InRole = true},
};

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

J'espérais un peu que les cases à cocher seraient cochées quand InRole = true. J'ai aussi essayé InRole = "Checked". Les résultats étaient les mêmes. Je n'arrive pas à trouver un moyen d'accéder à DataBind et de cocher/décocher automatiquement les cases. 

Actuellement, je résous le problème en définissant selected = true pour les éléments appropriés dans l'événement DataBound. On dirait qu'il y a une solution plus propre juste au-delà de ma portée.

Je vous remercie

26
Matthew Sposato

EDIT: Il n'y a aucun moyen de faire cela avec le balisage. DataValueField ne détermine pas si l'élément de case à cocher est coché ou non. Il récupère ou stocke la valeur à utiliser dans les publications. Le DataValueField est commun aux CheckBoxLists, RadioButtonLists, ListControl, etc.

C'est à peu près le seul moyen de présélectionner les cases à cocher comme vous l'avez déjà découvert.

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

foreach(ListItem item in chkListRoles.Items)
 item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;
38
Jose Basilio

J'ai créé un contrôle personnalisé pour cela, après m'être fatigué de la liaison OnItemDataBound-. Elle vous permettra de lier l'attribut Selected. Vous pouvez facilement créer le même contrôle pour RadioButtonList en modifiant l’origine du contrôle personnalisé.

Pour utiliser cela, ajoutez simplement l'attribut DataCheckedField lorsque vous créez le contrôle dans votre balise. N'oubliez pas de référencer les contrôles personnalisés dans votre fichier web.config .

Balisage

<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles"
                               DataCheckedField="InRole"
                               DataTextField="UserName"
                               DataValueField="UserId" />

Code pour le contrôle

public class SimpleCheckBoxList : System.Web.UI.WebControls.CheckBoxList
{
    public string DataCheckedField
    {
        get
        {
            string s = (string)ViewState["DataCheckedField"];
            return (s == null) ? String.Empty : s;
        }
        set
        {
            ViewState["DataCheckedField"] = value;
            if (Initialized)
                OnDataPropertyChanged();
        }
    }

    protected override void PerformDataBinding(IEnumerable dataSource)
    {
        if (dataSource != null)
        {
            if (!this.AppendDataBoundItems)
                this.Items.Clear();

            if (dataSource is ICollection)
                this.Items.Capacity = (dataSource as ICollection).Count + this.Items.Count;

            foreach (object dataItem in dataSource)
            {
                ListItem item = new ListItem()
                {
                    Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(),
                    Value = DataBinder.GetPropertyValue(dataItem, DataValueField).ToString(),
                    Selected = (DataCheckedField.Length > 0) ? (bool)DataBinder.GetPropertyValue(dataItem, DataCheckedField) : false
                };
                this.Items.Add(item);
            }
        }
    }
}
9
sshow

Ce n'est pas possible en utilisant un balisage. Ce que vous pouvez faire est de lier la liste de cases à cocher comme vous le souhaitez, avec le bool dans DataValueField, puis de simplement l'ajouter en tant qu'événement OnDataBound. 

protected void myCheckBoxList_DataBound(object sender, EventArgs e)
    {
        foreach (ListItem item in myCheckBoxList.Items)
        {
            item.Selected = bool.Parse(item.Value);
        }
    }

La différence entre cette solution et celle proposée par Jose Basilio est que celle-ci fonctionne avec toutes sortes de méthodes de databinding. Par exemple, la liaison avec un SelectMethod à l'aide de la nouvelle fonctionnalité ModelBinding de la v4.5.

5
Niklas Jonsson

Je pense que vous devez indiquer au contrôle à quelle propriété le lier ... dans ce cas, "InRole". 

J'ai joué avec et j'ai l'impression qu'il est maintenant temps de se lier à la sélection de la case à cocher, vous devez le faire vous-même. J'ai été capable de me lier au texte et aux valeurs de la liste de contrôle qui ne semblent traiter que de l'étiquette de chaque case à cocher de la liste.

0
CSharpAtl