Pergunta

É possível DataBind um CheckBoxList ASP.NET de tal forma que um valor de cadeia na dados torna-se o rótulo da caixa de seleção e um valor de bool Marca / desmarca a caixa?

No meu asp.net webform Eu tenho um CheckBoxList assim:

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

No code-behind Eu tenho esse código:

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

Eu estava meio que esperando que as caixas de seleção seria verificada quando InRole = true. Eu também tentei InRole = "verificado". Os resultados foram os mesmos. Eu não consigo encontrar uma maneira de DataBind e automagicamente têm as caixas de seleção marcada / desmarcada.

Atualmente eu resolver o problema definindo selecionado = true para os itens adequadas em caso DataBound. Parece que há uma solução mais limpa um pouco além do meu alcance.

Obrigado

Foi útil?

Solução

EDIT: Não há nenhuma maneira de fazer isso através da marcação. faz o DataValueField não determinar se o item caixa é verificar ou não. Ele recupera ou armazena o valor a ser usado em postagens. A DataValueField é comum em CheckBoxLists, radiobuttonlists, ListControl, etc.

Esta é a única maneira de pré-seleccionar as caixas de seleção como você já descobriu.

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

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

Outras dicas

Eu fiz um controle personalizado para isso, depois de obter cansados ??da ligação OnItemDataBound-. Ele permitirá que você ligar o atributo Selected. Você pode facilmente fazer o mesmo controle para RadioButtonList alterando o que a deriva de controle personalizado a partir.

Para usar isso, basta adicionar o atributo DataCheckedField quando você cria o controle na sua marcação. Lembre-se de fazer referência os controles personalizados em sua web.config arquivo.

Markup

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

código para o controle

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

Não é possível usando a marcação. O que você pode fazer é vincular a checkboxlist como você queria para o trabalho - com o bool na DataValueField, e, em seguida, basta adicionar isso como evento OnDataBound.

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

A diferença entre esta solução e o proposto por José Basilio é que este funciona com todos os tipos de métodos de ligação de dados. Por exemplo ligação com um SelectMethod usando o novo recurso ModelBinding em v4.5.

Eu acho que você teria que informar o controle que propriedade para vinculá-lo a ... neste caso "InRole".

Eu brinquei com ele e parece que há noway para ligar para a seleção da caixa de seleção, você tem que fazê-lo sozinho. Eu era capaz de se ligar ao texto e valores da lista de verificação que só parecem lidar com o rótulo de cada caixa de seleção na lista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top