2009-03-18 9 views
2

J'implémente une définition de liste personnalisée contenant plusieurs colonnes. Une des exigences de l'une des colonnes est qu'elle ne peut contenir que des valeurs uniques. Si un utilisateur entre une valeur qui est déjà présente dans un autre élément de liste, une erreur de validation doit être affichée.Création d'un champ personnalisé nécessitant des valeurs uniques

Existe-t-il des options pour faire cette OOTB, peut-être dans la définition de la liste ou dans un type de champ personnalisé? Ou dois-je mettre en œuvre cette fonctionnalité moi-même?

Répondre

3

Pour garantir des valeurs uniques dans une colonne, vous avez deux possibilités.

  1. Vous pouvez remplacer la méthode validate() pour votre type de champ, et interroger la liste des articles avec la même valeur et définir la propriété IsValid en conséquence.

  2. Ecrivez vos propres éléments de réception ItemAdding et ItemUpdating pour interroger la liste.

0

J'ai utilisé ce qui suit dans le passé.

/// <summary> 
      /// Override Validation to check to see if our list already contains an item with the same value 
      /// </summary> 
      /// <param name="value"></param> 
      /// <returns></returns> 
      public override string GetValidatedString(object value) 
      { 
       // Get Current List 
       SPList thisList = ParentList; 

       SPQuery keywordQuery = new SPQuery(); 

       // Check to see if the current field contains the value entered into field 
       keywordQuery.Query = string.Format("<Where>" + 
         "<Eq>" + 
          "<FieldRef Name='{1}' />" + 
          "<Value Type='Text'>{0}</Value>" + 
         "</Eq>" + 
        "</Where>", value, InternalName); 

       SPListItemCollection liKeywords = thisList.GetItems(keywordQuery); 

       // Will return greater than 0 if it finds the value in the list 
       if (liKeywords.Count > 0) 
       { 
        // checks to see if the list item is being updated, if it is the same finds the same ID as the one being Validated 
        if (liKeywords[0].ID != SPContext.Current.ItemId) 
        { 

         // Show error message 
         throw new SPFieldValidationException(string.Format("An item called '{0}' already exists", value)); 
        } 
       } 

       // return entered value if unique 
       return base.GetValidatedString(value); 
      } 

HTH Phill

0

Il existe une fonctionnalité open source appelée « Politique de colonne unique », disponible à http://www.codeplex.com/features, il permettra de résoudre votre problème sans créer une dépendance sur un nouveau type de champ.

Questions connexes