2009-12-15 3 views
0

Как заменить строку UserControl?Заменить строку с помощью элемента управления пользователя

, если строка = [$ control1 $]

заменить control1.ascx

+0

звук довольно подозрительный для меня – Natrium

+0

мы можем получить больше информации о том, что вы делаете? – CSharpAtl

+0

Im работает над системой управления контентом. Я хочу, чтобы пользователь мог добавлять некоторые теги psuedo, такие как [$ control1 $], которые будут заменены фактическим Control1.ascx, когда страница отображает – Neil

ответ

1

Вы не можете установить строку управления, так как они совершенно разные типы.

Вы можете установить строку текста элемента управления, так как текст типа строки:

string myString = control.Text; 
0

Также вы можете сделать управление строкой:

StringWriter sw = new StringWriter(); 
HtmlTextWriter htmlw = new HtmlTextWriter(sw); 
ctr.RenderControl(htmlw); 
string stringText = sw.ToString(); 
1

ли вы имеете в виду Вывод HTML пользовательским элементом управления, если он загружен на страницу?

Попробуйте это:

using System.Web.UI; 

public static string RenderToString(this Control control) 
{ 
    var sb = new StringBuilder(); 
    using (var sw = new StringWriter(sb)) 
    using (var textWriter = new HtmlTextWriter(sw)) 
    { 
     control.RenderControl(textWriter); 
    } 

    return sb.ToString(); 
} 

Update:

Ahh - сначала нужно синтаксический анализатор для строк (которые, как представляется, будет то, что How to a string can turn a UserControl о) - это даст вам имена пользовательские элементы управления заменяют.

С @ ответ Буны на этот вопрос:

static List<string> FindTokens(string str) 
{ 
    List<string> fields = new List<string>(); 
    foreach(Match match in Regex.Matches(str, @"\{([^\}]*)\}")) 
    { 
     fields.Add(match.Groups[1].Value); 
    } 
    return fields; 
} 

Итак нам нужна функция, чтобы загрузить элементы управления:

Dictionary<string, string> GetControls(List<string> controlNames) 
{ 
    Dictionary<string, string> retval = new Dictionary<string, string>(); 
    foreach(string controlName in controlNames) { 
    { 
     // load the control 
     Control ctrl = LoadControl("~/AllowedDynamicControls/" + controlName + ".ascx"); 

     // add to the dictionary 
     retval.Add(controlName, ctrl.RenderToString()); 
    } 
} 

Затем использовать результаты этого заменить лексемы:

var tokensInString = FindTokens(input); 
var tokenContent = GetControls(tokensInString); 

foreach(var pair in tokenContent) 
{ 
    input = input.Replace("[$" + pair.Key + "$]", pair.Value); 
} 

Возможно, это более эффективный способ сделать это. Я использовал замену как быстрый пример.

+0

. Этот поток объясняет это немного лучше, http://stackoverflow.com/ вопросы/1535365/как к струне-кан-поворот-а-UserControl – Neil

0

Скажем, строка шаблона: {product_thumbnail} | {product_title} | {product_price} , и вы хотите заменить каждый текст в скобках ({}) на элемент управления. Вот как я это сделал.

string templateString = "{product_thumbnail} | {product_title} | {product_price} "; 
Regex d = new Regex("\\{\\w+\\}", RegexOptions.Multiline); 
MatchEvaluator matchEval = RegexReplaceEvaluator; 
string r = d.Replace(templateString, matchEval); 

private string RegexReplaceEvaluator(Match match) 
{ 
    string matchValue = match.Value.Trim('}'); 
    matchValue = matchValue.Trim('{'); 
    Control toAdd = null; 
    switch (matchValue) 
    { 
    case "product_thumbnail": 
      toAdd = this.LoadControl("ThumbnailImage.ascx", DetailsRow); 
    break; 
    case "product_price": 
      toAdd= this.LoadControl("Price.ascx", DetailsRow); 
    ..... 
    } //end switch statement 

if (toAdd != null) { 
       PlaceHolder1.Controls.Add(new LiteralControl(templateString.Substring(stringIndexMarker, match.Index - stringIndexMarker))); 
       stringIndexMarker = match.Index + match.Length; 
       PlaceHolder1.Controls.Add(toAdd); 
      } 
      return match.Value; 
}//end method 

Код выше просто делает следующее: 1. принимает в строке шаблона. (строка с текстом для замеченных элементов управления). 2. Объявляет местозаполнитель (для хранения окончательного вывода). 3. Итерации через строку. Когда он находит строку для замены с помощью элемента управления, он берет текст перед этим, добавляет его как текст в местозаполнитель, а также добавляет элемент управления.

Надеюсь, что это имеет смысл.

Смежные вопросы