Frage

Ist es möglich, ein ASP.NET CheckBoxList so DataBind, dass ein String-Wert in den Daten das Etikett des Kontrollkästchens wird und eine Bool Wert Aktiviert / deaktiviert die Box?

Auf meinem asp.net Webformular Ich habe eine CheckBoxList wie folgt aus:

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

In der Code-behind Ich habe diesen 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();

Ich hatte gehofft, irgendwie, dass die Kontrollkästchen, wenn InRole = true geprüft werden würde. Ich habe auch InRole = „Aktiviert“ versucht. Die Ergebnisse waren die gleichen. Ich kann nicht scheinen, einen Weg zu DataBind zu finden und automatisch die Kontrollkästchen aktiviert / deaktiviert.

Zur Zeit löse ich das Problem, indem = true für die entsprechenden Elemente in dem Databound-Ereignisse gewählter Einstellung an. Es scheint, als gäbe es eine sauberere Lösung nur über meinen Griff.

Danke

War es hilfreich?

Lösung

EDIT: Es gibt keine Möglichkeit, dies durch das Markup zu tun. Die Datavaluefield bestimmt nicht, ob das Kontrollkästchen Artikel überprüfen oder nicht. Es holt oder speichert den Wert in Postbacks verwendet werden. Die Datavaluefield ist üblich, über CheckBoxLists, RadioButtonLists, List, etc.

Das ist so ziemlich der einzige Weg, um die Kontrollkästchen, um vorzuwählen, wie Sie bereits herausgefunden haben.

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

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

Andere Tipps

habe ich eine individuelle Steuerung für diesen, nach müde von der OnItemDataBound-Bindung zu bekommen. Es wird Ihnen das Selected Attribut binden. Sie können ganz einfach die gleiche Steuerung für RadioButtonList machen, indem, was die individuelle Steuerung ergibt sich aus.

Um dies zu nutzen, fügen Sie einfach das DataCheckedField Attribut, wenn Sie das Steuerelement in Ihrem Markup erstellen. Denken Sie an die benutzerdefinierten Steuerelemente verweisen in Ihrem web.config Datei.

Markup

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

Code für das Steuerelement

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

Es ist nicht möglich Markup verwenden. Was Sie tun können, ist den Checkboxlist zu binden, wie man es wollte arbeiten - mit dem Bool im Datavaluefield, und dann fügen Sie einfach diese als OnDataBound Ereignis.

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

Der Unterschied zwischen dieser Lösung und dem von Jose Basilio vorgeschlagen ist, dass diese mit allen Arten von Datenbindung Methoden arbeitet. Zum Beispiel der Bindung mit einem Select die neue ModelBinding Funktion in v4.5 verwenden.

Ich würde denken, Sie müßten die Kontrolle sagen, welche Eigenschaft sie zu binden ... in diesem Fall „InRole“.

Ich spielte mit ihm um und scheint, wie es noway auf die Auswahl der Checkbox zu binden, müssen Sie es selbst tun. Ich konnte den Text und die Werte der Checkliste binden, die nur scheinen mit dem Etikett jeder Checkbox in der Liste zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top