2010-02-15 4 views
1

J'ai une chaîne avec des caractères spéciaux insérés à différents endroits. Par exemple:Remplacer la chaîne par un contrôle

string myString = "This is a textbox: ##"; 

Je voudrais remplacer le ## avec un contrôle (à savoir une zone de texte).

La méthode Replace permet uniquement de remplacer la chaîne par une autre chaîne ou un autre caractère (ce qui est compréhensible). Mais quelle serait la meilleure façon de remplacer dynamiquement le ## avec un contrôle dans sa position? Je pensais que je pourrais peut-être le remplacer par du balisage HTML qui serait exécuté, mais je ne sais pas très bien comment cela serait réalisé.

Merci

EDIT: Pour clarifier quelques détails. Les chaînes sont extraites d'une base de données, donc je ne peux pas utiliser le contrôle PlaceHolder. L'utilisateur sélectionne une chaîne dans une liste déroulante. La valeur de l'élément est la chaîne avec des caractères spéciaux. Lorsque le postback se produit à partir de la sélection d'un élément, je voudrais afficher la chaîne sur le site, mais remplacer les caractères spéciaux avec un contrôle entièrement fonctionnel (dans ce cas, une zone de texte)

+0

Pour être sûr de bien comprendre, il s'agit d'un projet ASP.NET et vous souhaitez émettre dynamiquement un contrôle où vous avez ce caractère spécial? Est-ce exact? – smaclell

+0

Hé, oui c'est correct.Les caractères spéciaux sont simplement des espaces réservés pour où dans la chaîne le contrôle devrait aller. – Skoder

+0

Pourquoi ne pouvez-vous pas effacer l'espace réservé après la publication et ajouter à nouveau tous les contrôles? – sashaeve

Répondre

1

Envisagez de tirer parti de la méthode Render() de TextBox. Cela vous obtiendra le HTML qui serait produit à partir de cette TextBox.

Vous pouvez ensuite utiliser cette chaîne comme texte de remplacement pour remplacer la partie ## de votre chaîne.

TextBox Render() on MSDN

var myTxtBox = new TextBox(); 
myTxtBox.Text = "Hello World"; 

//implement the Render code in here 
string myRenderedTextBoxHTML = RenderIt(myTxtBox); 

string myString = "This is a textbox: " + myRenderedTextBoxHTML; 

Je suis pas sûr ViewState serait disponible pour ce contrôle ou non.

+0

Hey, merci, je vais avoir une lecture de cela. – Skoder

+0

J'ai lu, mais je ne comprends pas très bien. Quel HTMLWriter dois-je passer dans la méthode Render? Ou dois-je créer mon propre contrôle personnalisé qui étend la zone de texte? Merci – Skoder

0
myString = string.Replace("##", "<input type='text' />"); 

Notez que c'est pas un contrôle: ce sera juste un élément html qui ne sera pas câblé du côté serveur plus tard. Et en fonction de ce que vous faites avec la chaîne peut-être même pas autant, comme certains contrôles (comme label) échapperont automatiquement vos caractères < et >.

Si vous voulez vraiment un contrôle asp.net qui fonctionne, nous devons en savoir plus sur la façon dont vous ajoutez cette chaîne à la page.

+0

Hey, même question que ci-dessus. Cette méthode fonctionnerait-elle avec les zones de texte ASP.NET? – Skoder

+0

Merci pour la réponse. Je vais mettre à jour ma question. – Skoder

+0

La chaîne peut être ajoutée de n'importe quelle façon qui permettrait à cela de fonctionner. Pour l'instant, c'est simplement un contrôle littéral, mais cela peut être changé. – Skoder

0

Vous pouvez même la remplacer par un balisage:

string mystring = "This is a textbox: ##".Replace("##", "<input type='text'/>"); 
Response.Write(mystring); 

Je ne sais pas pourquoi vous voulez faire cela, cependant. Pourquoi ne pas utiliser un contrôle PlaceHolder et y coller simplement un TextBox dans le code?

+0

Hey, les chaînes sont extraites de la base de données. Je vais essayer la méthode de remplacement, mais cela fonctionnerait-il avec les contrôles ASP.NET (et pas seulement les contrôles HTML standard?) – Skoder

+0

Probablement pas. J'aime la méthode de pcampbell d'utiliser la méthode Render à la place. –

1

Quelque chose comme ceci:

Panel panel = new Panel(); 
string myString = "This is a textbox: ##"; 
// some parsing logic 
string[] arr = { "This is a textBox", "##" }; 

foreach(var item in arr) 
{ 
    if (item == "##"){ 
    TextBox tb = new TextBox(); 
    panel.Controls.Add(tb); 
    } 
    else{ 
    Label l = new Label(); 
    l.Text = item; 
    panel.Controls.Add(l); 
    } 
} 

your_plaaceholder.Controls.Add(panel); 
0

Quelle Sash a dit, mais assurez-vous que mettre dans le Page.Init() chaque fois que si vous souhaitez profiter de viewstate.