2011-01-26 3 views
0

Je développe un contrôle personnalisé qui doit afficher une liste déroulante en tant que contrôle composite.ASP.Net Custom Control

La liste déroulante est remplie à partir d'un service Web de repos. Le problème auquel je suis confronté est que la liste déroulante n'a que DataTextField et DataValueField mais j'ai besoin d'un moyen de stocker plus de valeurs dans le contrôle, c'est-à-dire que j'ai besoin d'autres propriétés pour l'élément sélectionné.

Quelle est la meilleure façon de procéder?

Voici le code que j'ai jusqu'à présent:

[ValidationProperty("SelectedValue")] 
    public class SelectSurveyControl : Panel 
    { 
     private DropDownList ddlSurveys; 

     public string SelectedSurveyId 
     { 
      get 
      { 
       return SelectedValue; 
      } 
     } 

     public string SelectedSurveyJavascriptEmbedCode 
     { 
      get 
      { 
       return this.ddlSurveys.SelectedItem.Attributes[""]; 
      } 
     } 

     public string SelectedValue 
     { 
      get 
      { 
       return ddlSurveys.SelectedValue; 
      } 
      set 
      { 
       if (ddlSurveys == null) 
       { 
        ddlSurveys = new DropDownList(); 
       } 

       ddlSurveys.SelectedValue = value; 
      } 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnInit(e); 

      if (ddlSurveys == null) 
      { 
       ddlSurveys = new DropDownList(); 
      } 

      IList<Survey> surveys = GetSurveys(); 

      this.ddlSurveys.DataSource = surveys; 
      this.ddlSurveys.DataTextField = "title"; 
      this.ddlSurveys.DataValueField = "id"; 

      this.ddlSurveys.DataBind(); 

      ddlSurveys.SelectedValue = this.SelectedValue; 
      ddlSurveys.CssClass = "umbEditorTextFieldMultiple charlimit"; 
      ddlSurveys.Attributes.Add("SurveyId", SelectedSurveyId); 
      ddlSurveys.Attributes.Add("JavascriptEmbedingCode", SelectedSurveyId); 

      this.Controls.Add(ddlSurveys);    
     } 

     public IList<Survey> GetSurveys() 
     { 
      ... 
     } 
} 
+0

http://stackoverflow.com/questions/2001521/html-dropdown-selection-value peut vous donner un point de départ de ce problème. – DaveParsons

+0

Comment puis-je l'obtenir en code .Net? – Burt

+0

Avez-vous besoin de données supplémentaires pour être disponibles sur le client ou pour traitement sur le serveur? – DaveParsons

Répondre

1

Essayez d'utiliser une join/split pour stocker et récupérer les différentes valeurs, alors vous ne devez pas personnaliser votre liste déroulante beaucoup.

Exemple:

Texte: Certains Titre

Valeur: 1 | Test d'essai | 2/12/2010

Cela vous permettra de stocker autant de valeurs que vous voulez, si Tant que vous choisissez un personnage approprié à joindre et à partager. J'utilise habituellement la barre, comme dans mon exemple ci-dessus.

Côté Remarque: Je regardais votre gestionnaire de jeu de valeurs sélectionné et il a besoin de quelques ajustements. Vous ne devriez pas vérifier une liste déroulante nulle, à la place, vous devriez appeler EnsureChildControls() avant chaque get et set à la place. Assurez-vous de remplacer la méthode CreateChildControls() et créez vos contrôles à cet endroit.

1

Vous pouvez utiliser un champ caché et itérer à travers une copie des questionnaires retournés comme ceci:

foreach(Survey s in Surveys){ 
string val = s.id + ":" + s.<property1> + ":" + s.<property2>; 
hiddenField.Value += val +","; 
} 

Lorsque vous avez besoin de lire à partir du champ caché, vous utilisez String.Split pour séparer les valeurs dans des tableaux en utilisant ',' comme séparateur et dans chaque tableau, vous divisez à nouveau en utilisant ':'.

Dans la première division Array1 [0] qui serait l'identificateur d'enquête et Array1 [n! = 0] seraient les propriétés de l'enquête avec l'id = Array1 [0]. Array [n! = 0] serait alors divisé en Array2.

Je suggère de gérer les valeurs de propriété vides avec une chaîne vide ou quelque chose, sinon vous pourriez vous retrouver avec des longueurs inégales, surtout si vous spécifiez StringSplitOptions.RemoveEmptyEntries.

Agricfowl