Question

Est-il possible de Databind une ASP.NET CheckBoxList telle qu'une valeur de chaîne dans les données devient l'étiquette de la case à cocher et un contrôle de valeur bool / désactive l'encadré?

Sur mon Webform asp.net J'ai un CheckBoxList comme ceci:

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

Dans le code derrière je 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 vérifiées lorsque InRole = true. J'ai aussi essayé InRole = « checked ». Les résultats étaient les mêmes. Je ne peux pas sembler trouver un moyen de DataBind et automagiquement ont les cases à cocher cochée / décochée.

Actuellement, je résous le problème en paramètre sélectionné = true pour les éléments appropriés en cas DataBound. On dirait qu'il ya une solution plus propre juste au-delà de ma portée.

Merci

Était-ce utile?

La solution

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

Ceci est la seule façon d'effectuer une pré-sélectionner les cases à cocher que vous 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;

Autres conseils

J'ai fait un contrôle personnalisé pour cela, après avoir fatigué du OnItemDataBound contraignant. Il vous permettra de lier l'attribut Selected. Vous pouvez facilement faire le même contrôle pour RadioButtonList en changeant ce que le contrôle personnalisé dérive.

Pour l'utiliser, il suffit d'ajouter l'attribut DataCheckedField lorsque vous créez le contrôle dans votre balisage. Rappelez-vous de référencer les contrôles personnalisés dans votre web.config fichier.

Markup

<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);
            }
        }
    }
}

Il est impossible en utilisant le balisage. Ce que vous pouvez faire est de lier le CheckBoxList comme vous le vouliez travailler - avec le bool dans le DataValueField, puis simplement ajouter que l'é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 celui-ci fonctionne avec toutes sortes de méthodes de liaison de données. Par exemple la liaison avec une SelectMethod en utilisant la nouvelle fonctionnalité ModelBinding dans v4.5.

Je pense que vous auriez à dire le contrôle ce que la propriété de se lier à ... dans ce cas « InRole ».

J'ai joué avec elle et semble comme il est noway de se lier à la sélection de la case à cocher, vous devez le faire vous-même. Je suis capable de se lier au texte et les valeurs de la liste de contrôle qui ne semblent traiter l'étiquette de chaque case à cocher dans la liste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top