ASP.NET CheckBoxList DataBinding Pergunta
-
22-08-2019 - |
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
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.