2010-09-30 13 views
2

Il est connu que le contrôle ListView ne peut pas afficher à la fois un EmptyDataTemplate et un InsertItemTemplate en même temps.ListView personnalisé pour afficher EmptyDataTemplate et InsertItemTemplate en même temps

Pour mon style de design, je dois être capable de montrer les deux. Je veux être en mesure de montrer qu'aucune donnée n'existe et en même temps montrer un formulaire pour ajouter de nouvelles données.

J'ai déjà implémenté diverses solutions, telles que placer un PlaceHolder dans mon LayoutTemplate puis afficher ou masquer manuellement ce PlaceHolder dans le code-behind, selon qu'il y a des données ou non.

Cependant, je voudrais un contrôle qui a cette capacité intégrée afin de garder ma lumière code-behind.

Je crois qu'il ya deux façons de réaliser ce que je veux:

  1. La première façon (de préférence) est d'écrire moi-même contrôle personnalisé. Je pensais dériver de ListView et remplacer la fonction responsable de la désactivation de l'EmptyDataTemplate, mais je n'ai aucune expérience avec les contrôles personnalisés. Et je ne suis même pas sûr que ça marchera à la fin.

  2. Deuxième méthode est d'utiliser un contrôle personnalisé trouvé ou acheté quelque part. Je n'ai pas été en mesure de trouver un tel contrôle qui a les mêmes capacités de base que le ListView.

Quelqu'un at-il une idée de la façon de résoudre # 1 et peut-être # 2?

Merci.

Répondre

3

Voici ce que je fini par faire:

public class MyListView : ListView 
{ 
    protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding) 
    { 
     int itemCount = base.CreateChildControls(dataSource, dataBinding); 

     if (this.InsertItemPosition != InsertItemPosition.None && itemCount == 0) 
     { 
      CreateEmptyDataItem(); 
     } 

     return itemCount; 
    } 
} 

fonctionne très bien!

+0

Excellente solution, j'ai dû ignorer la fonction CreateEmptyDataItem lorsque j'ai écrit mon code. Merci pour la générosité! – Willem

-1

Je ne comprends pas grand-chose de vos exigences sans une capture d'écran de ce que vous essayez réellement d'accomplir. Quoi qu'il en soit, vous pouvez être en mesure d'atteindre cette interface avec une combinaison de ListView + FormView ou ListView + un contrôle utilisateur. Si vous pouvez fournir plus d'informations, je peux aider plus loin.

1

Je pencherais pour votre option 1: Créer un contrôle personnalisé Parce que vous n'avez pas spécifié un langage de programmation que j'ai fait un en VB.NET:

Public Class CustomListView 
    Inherits ListView 
    Public Sub CheckEmptyData() Handles Me.PreRender 
     If Me.Items.Count = 0 Then 
      Dim label As New Label 
      label.Text = "No data found <br/>" 
      Me.Controls.AddAt(0, label) 
     End If 
    End Sub 
End Class 

Juste testé et fonctionne parfaitement, il peut remplacez simplement un ListView existant.

Comme vous pouvez le voir, il vérifie s'il y a des données et sinon il insère une étiquette avec le texte "Aucune donnée trouvée". Je n'ai pas trouvé un moyen facile d'utiliser le EmptyDataTemplate pour cela, ce serait une meilleure option, mais cela pourrait déjà fonctionner pour vous.

Une autre option consiste à masquer le InsertItem (InsertItemPosition.None) s'il n'y a aucune donnée, et ajouter un bouton "Insert" à l'EmptyDataTemplate qui active le InsertItemTemplate et donc cache le EmptyDataTemplate.

+2

Merci beaucoup, cela m'a aidé à résoudre mon problème. Je suis parti de votre suggestion et j'ai travaillé jusqu'à une résolution parfaite. Je vais vous attribuer les points parce que vous le méritez, mais j'ajouterai ma propre solution. – md1337

+2

Pas que j'attends une réponse après avoir donné tous les points mais ... Il y a un problème avec ça. Dans le InsertItemTemplate j'ai un RequiredFieldValidator sur le champ utilisé pour insérer de nouveaux éléments, et il continue à être déclenché ... – md1337

+0

Vous voulez dire qu'il continue à se déclencher et ne parvient pas à valider même si le TextBox (?) A une valeur? Ou est-ce déclenché lorsque vous essayez de faire quelque chose d'autre sur la page (autre bouton ou quelque chose) et n'essayez pas d'insérer un élément? Si le second est le cas, essayez d'ajouter un groupe de validation au validateur, à la zone de texte et au bouton d'insertion. – Willem