Заменить строку пользовательским элементом управления - PullRequest
0 голосов
/ 15 декабря 2009

Как я могу заменить строку с UserControl?

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

заменить на control1.ascx

Ответы [ 4 ]

1 голос
/ 15 декабря 2009

Вы имеете в виду вывод 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();
}

Обновление:

Ааа - во-первых, вам нужен анализатор для строк (который выглядит так: Как строка может превратить 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);
}

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

1 голос
/ 15 декабря 2009

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

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

string myString = control.Text;
0 голосов
/ 21 февраля 2012

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

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. Перебирает строку. Когда он находит строку для замены на элемент управления, он принимает текст перед этим, добавляет его в качестве текста к заполнителю, а также добавляет элемент управления.

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

0 голосов
/ 15 декабря 2009

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

StringWriter sw = new StringWriter();
HtmlTextWriter htmlw = new HtmlTextWriter(sw);
ctr.RenderControl(htmlw);
string stringText = sw.ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...