Как заменить строку UserControl?Заменить строку с помощью элемента управления пользователя
, если строка = [$ control1 $]
заменить control1.ascx
Как заменить строку UserControl?Заменить строку с помощью элемента управления пользователя
, если строка = [$ control1 $]
заменить control1.ascx
Вы не можете установить строку управления, так как они совершенно разные типы.
Вы можете установить строку текста элемента управления, так как текст типа строки:
string myString = control.Text;
Также вы можете сделать управление строкой:
StringWriter sw = new StringWriter();
HtmlTextWriter htmlw = new HtmlTextWriter(sw);
ctr.RenderControl(htmlw);
string stringText = sw.ToString();
ли вы имеете в виду Вывод 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);
}
Возможно, это более эффективный способ сделать это. Я использовал замену как быстрый пример.
. Этот поток объясняет это немного лучше, http://stackoverflow.com/ вопросы/1535365/как к струне-кан-поворот-а-UserControl – Neil
Скажем, строка шаблона: {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. Итерации через строку. Когда он находит строку для замены с помощью элемента управления, он берет текст перед этим, добавляет его как текст в местозаполнитель, а также добавляет элемент управления.
Надеюсь, что это имеет смысл.
звук довольно подозрительный для меня – Natrium
мы можем получить больше информации о том, что вы делаете? – CSharpAtl
Im работает над системой управления контентом. Я хочу, чтобы пользователь мог добавлять некоторые теги psuedo, такие как [$ control1 $], которые будут заменены фактическим Control1.ascx, когда страница отображает – Neil