2009-07-02 4 views
1

Извините, если заголовок сообщения не был ясен, я постараюсь объяснить здесь немного лучше.Возможно ли изменение содержимого данных на лету?

Я работаю с веб-элементом управления, который привязывается к таблице данных. Выход данных как таковой:

<asp:Repeater ID="RssRepeater" Visible="false" EnableViewState="false" runat="server"> 
    <asp:literal ID="sb_description" Text='<%# DataBinder.Eval (Container.DataItem, "description") %>' EnableViewState="false" runat="server" /> 
    ''// Rest of structure... 
</asp:Repeater> 

Я написал функцию, которая, по идее, должен обрезать переданную строку заданного количества слов:

protected string CreateTeaser(string Post) 
{ 
    int wordLimit = 50; 
    System.Text.StringBuilder oSB = new System.Text.StringBuilder(); 

    string[] splitBy = new string[] { " " }; 

    string[] splitPost = Post.Split(splitBy, 
         System.StringSplitOptions.RemoveEmptyEntries); 

    for (int i = 0; i <= wordLimit - 1; i++) 
    { 
     oSB.Append(string.Format("{0}{1}", splitPost[i], 
        (i < wordLimit - 1) ? " " : "")); 
    } 

    oSB.Append(" ..."); 

    return oSB.ToString(); 
} 

Я попробовал эту мерзость:

<asp:literal ID="sb_description" Text='<%= CreateTeaser(%> <%# DataBinder.Eval (Container.DataItem, "description") %><%=); %>' EnableViewState="false" runat="server" /> 

Но, конечно, это не сработало. Итак, можно ли использовать эту функцию на Databinder.Eval(...), пока она находится внутри этого литерального элемента управления? Если да, то как я должен это делать? Если нет, то какая из возможных альтернатив тому, что я пытаюсь сделать?

Спасибо!

ответ

2

Вы можете представить Eval результат непосредственно к методу (используя оригинальный Eval синтаксис и литье в строку):

<asp:literal 
    ID="sb_description" 
    Text='<%= CreateTeaser((string)DataBinder.Eval (Container.DataItem, "description")) %>' 
    EnableViewState="false" 
    runat="server" 
/> 
+0

спасибо, это достало меня на правильном пути :) – Anders

1

Было бы намного легче сделать это в событии RowDataBound.

+0

Спасибо за ответ! Я использую элемент управления ASP: Repeater для отображения моих данных. Этот элемент управления не имеет этого свойства, есть ли что-то еще, что я могу сделать? – Anders

0

Я бы не использовать <% # BLEH%> материал вообще для этого , Вы можете привязать свой ретранслятор к вашему кодовому блоку с помощью события OnItemDataBound для asp: Repeater.

Просто установите источник данных ретранслятора и вызовите DataBind на нем.

List<stuff> feeds = //list of rss feeds, I am guessing. 
RssRepeater.DataSource = feeds; 
RssRepeater.DataBind(); 

Затем вы можете сделать что-то более конкретное за пункт в случае

protected void RssRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    Literal label = (Literal)e.Item.FindControl("sb_description"); 
    label.Text = CreateTeaser(post); //post coming from your repeater somewhere. I can't see its definition 
    //post could probably be e.Item.DataItem, depending on how you do your DataSource 
} 

Этот подход намного проще читать и поддерживать, чем мутит ваш ASPX

+0

Спасибо, мужчина. Я закончил использовать производную от этого, используя информацию, которую г-н Sternal опубликовал, чтобы понять это. – Anders

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