2011-12-12 4 views
0

Je dois ajouter des objets d'interface utilisateur à une page en fonction des résultats de chaîne d'une requête. "textbox, textbox, checkbox, textbox", par exemple, afficherait 3 éléments de zone de texte et un élément de case à cocher sur l'écran. J'ai également besoin de lire les valeurs que chacun détient lorsque l'utilisateur clique sur un bouton.Création d'une interface utilisateur basée sur des valeurs de texte

Je n'arrive pas à déterminer comment conserver différents types d'objets dans une collection, donc je peux lire toutes les valeurs dans le bon ordre, quel que soit le type. J'aurai besoin d'une sorte de polymorphisme pour ajouter et lire les valeurs. Des idées pour me pousser dans la bonne direction?

+0

Vérifiez ma réponse ci-dessous. De plus, Javascript et JSON s'adaptent bien à la polymorphisation car rien n'est dur comme en C#, ce sont toutes les chaînes d'appariement clé/valeur, et c'est certainement là que vous devez gérer les problèmes de l'interface utilisateur plutôt que sur le serveur. Assurez-vous simplement que votre code côté serveur prend vos objets C#, l'analyse en une chaîne JSON, l'envoie au navigateur ... puis il peut être analysé en retour vers un objet javascript. –

Répondre

1
const string TEXTBOX = "textbox"; 
    const string CHECKBOX = "checkbox"; 

    //assuming your result set is placed in a data table or dictionary we can enumerate through //the result set and based on the text comparison add a check box or textbox. 

    Panel panel = new Panel(); 

    DataTable dataTable = getResultSet(); 
    foreach(DataRow row in dataTable.Rows) 
    { 
     string comparison = row["<columnNameContaining yuur "TextBox" or "CheckBox text>"].value; 
     switch(comparison) 
     { 
      case TEXTBOX: 
       textBox = new TextBox(); 
       panel.Controls.Add(textBox); 
       break; 
      case CHECKBOX; 
       CheckBox checkBox = new checkBox(); 
       panel.Controls.Add(checkBox); 
       break; 
     } 
    } 

Espérons que cela aide. De même, si vous souhaitez spécifier des noms pour vos cases à cocher et vos zones de texte, vous pouvez également les stocker dans votre magasin de données afin d'attribuer au moins un identifiant unique qui pourra être utilisé ultérieurement pour lire des valeurs depuis l'interface utilisateur. vous utiliserez donc la méthode FindControl() et transmettrez le nom d'ID unique. Cela ressemblerait à quelque chose comme ça.

Textbox textBox = (TextBox)panel.FindControl("<unique ID"); 
if(textBox != null) 
{ 
    string value = textBox.Text; 
} 

J'ai utilisé une méthode similaire pour remplir et récupérer les valeurs d'un detailsview que doens't utiliser les sources de données génériques pour remplir et récupérer les valeurs en utilisant ma couche logique métier.

+0

J'ai fini par aller avec quelque chose de similaire. Comme j'avais plusieurs autres propriétés associées à l'élément de l'interface utilisateur, je voulais quand même les stocker dans une classe et créer une liste. Je pense toujours qu'il y a une meilleure façon de le gérer, mais cela m'a certainement permis de franchir la ligne d'arrivée. Merci! –

+0

Je pense que vous pourrez peut-être utiliser une liste de WebControls comme TextBox et CheckBox héritent de la classe WebControl. Vous pouvez utiliser cette liste pour remplir le formulaire, mais vous devrez les convertir en CheckBox ou TextBox lorsque vous souhaitez lire les valeurs à partir des contrôles. Si vous utilisez cette méthode, vous pouvez utiliser Linq, sinon vous êtes coincé en utilisant un objet ADO comme un DataTable. – gsirianni

0

Commencez avec un formulaire vide dans votre page HTML:

<form> 
    <div id="formElementsContainer"> 

    </div> 
</form> 

Structure la chaîne retournée au client sous forme de données JSON. Quelque chose comme ça pourrait fonctionner pour un seul élément

{ 
    "ui-model": "textbox", 
    "value": {"prop1": "value1", "prop2": "value2", /* etc */ } 
} 

- ou quelque chose comme ça pour une collection -

{ 
    "uimodel": "checkbox", 
    "value": { "myCollection": [ 
     {"prop1": "value1", "prop2": "value2", /* etc */ }, 
     {"prop1": "value1", "prop2": "value2", /* etc */ }, 
     {"prop1": "value1", "prop2": "value2", /* etc */ } 
    ]} 
} 

Utilisez jQuery/Javascript pour analyser le JSON en objets javascript:

var data = $.parseJSON(/* your JSON data here */) 

Dites Prop1 est le nom de l'élément et prop2 est la valeur qui va dans la zone de texte. Utilisez les données de l'objet pour construire vos éléments de formulaire et les ajouter au formulaire conteneur éléments:

var ui = data.uimodel; // textbox 
var obj = data.value; 

var textbox = '<input type="' + ui + '" id="' + obj.prop1 +'">' + obj.prop2 + '</input>'; 
$('#formElementsContainer').append(textbox); 

ceci est un exemple très simple, et bien sûr vérifiez le code, mais il vous permettra de démarrer. Lorsque vous renvoyez le formulaire au serveur, les valeurs des éléments d'entrée sont renvoyées pour que vous utilisiez C# côté serveur.

+0

Une chose à noter ... si vous voulez renvoyer les choses à plus grande échelle, vous pouvez simplement envelopper les exemples d'éléments d'objet ci-dessus dans une collection JSON plus grande et écrire la logique à énumérer à travers la collection. –

0

La méthode la plus simple consiste à associer les valeurs d'objet à un dictionnaire. Ses valeurs seront mises à jour par les gestionnaires d'événements relatifs que vous allez créer pour chaque objet.

Questions connexes