2009-04-16 7 views
1

J'ai pris le temps de prendre une décision de conception sur la façon d'indiquer «aucune sélection» dans une zone de liste déroulante liée aux données. Je souhaite appliquer ceci à toutes les occurrences futures où un ComboBox a besoin de ceci. On ne peut pas définir SelectedIndex à -1 sur les combos liées aux données, ni définir SelectedValue sur null.Dummy Item dans ComboBox

Les solutions généralement suggérées consistent à ajouter une ligne fictive à la liste déroulante, mais sans connaître les objets liés aux lignes, une combinaison ne peut pas créer de manière fiable un objet fictif de façon à afficher le message 'non sélectionné'. Je ne souhaite pas ajouter un autre élément sur la source de données, car cela compromettrait la liste pour les autres clients n'utilisant pas d'objet factice.

Quelles sont les autres options disponibles? BTW, j'utilise un Telerik RadComboBox, mais ce scénario n'est pas spécifique au contrôle Telerik.

Répondre

2

Vous pouvez définir l'élément « vide » dans le balisage, et ajouter tous les éléments liés aux données:

<asp:DropDownList DataSourceID="..." AppendDataBoundItems="true" ...> 
    <asp:ListItem Value="-1" Text="None"></asp:ListItem> 
</asp:DropDownList> 

La clé est de spécifier AppendDataBoundItems = « true » pour ajouter les éléments liés aux données à tous les éléments spécifiés directement dans le balisage.

Cela fonctionne pour la DropDownList ASP.NET standard mais aussi pour la Telerik RadComboBox.

+2

également à noter que si vous faites cela (que je suggère :)) et que vous voulez en faire un champ obligatoire. Vous pouvez spécifier la propriété 'InitialValue =" - 1 "' sur le RequiredFieldValidator –

1

Ajoutez un nouvel élément avant la databind et définissez AppendDataboundItems = true;

cbo.AppendDataboundItems = true; 
cbo.Items.add(new ListItem("None", "-1"); 
cbo.DataSource = x; 
cbo.DataBind(); 
0

Hope I aucune propriété comme AppendDataBoundItems dans ThickClient (fenêtre App) Une meilleure insertion d'une ligne fictive dans votre table de source de données dans l'index Zeroth.

 DataRow dr = dtsource.NewRow(); 
     dr["username"] = "--New User---"; 
     dr["Userid"] = 0; 


     dtsource.Rows.InsertAt ((dr),0); 
     cmbToUser.DataSource = dtsource; 
0

IMO c'est là que la liaison de données tombe à plat sur son visage. Sur les contrôles non-databound, c'est vraiment facile - il suffit d'ajouter l'élément fictif à la liste déroulante avant d'ajouter manuellement les autres éléments.

Pour effectuer cela de manière fiable avec tous les types de zone de liste déroulante, vous devez ajouter l'élément à votre ensemble de données, ce qui viole la séparation entre la présentation et la fonction que la liaison de données est censée vous apporter.

Plus souvent qu'autrement, la liaison de données vous permet d'économiser du temps jusqu'à un certain point. Lorsque vous commencez à pirater des choses pour surmonter les lacunes de la liaison de données, vous ne gagnez plus de temps.

Ma recommandation pour cela est généralement de réévaluer si la liaison de données est la bonne solution.

/Rant sur