Как использовать записи привязки данных во встроенных операторах if

вот моя проблема:

У меня есть репитер на моем asp.net (VB):

<asp:Repeater ID="Repeater1" runat="server">    
<ItemTemplate>
  <asp:Label ID="Label1" runat="server" Text='<%# Eval("Question_Number") %>' /> 
  <%#Eval("Question_Desc")%>

Теперь я хочу проверить значение, которое я не использовал, под названием «Тип_вопроса», которое может быть = 1, 2 или 3 в зависимости от того, является ли это множественным выбором, коротким ответом и т. Д.

Я пробовал это:

<%  
if Eval("Question_type") = 1 then

Response.Write(" <asp:RadioButton runat=""server"">test1</asp:RadioButton>")
Response.Write(" <asp:RadioButton runat=""server"">test2</asp:RadioButton>")
Response.Write(" <asp:RadioButton runat=""server"">test3</asp:RadioButton>")

end if
%>

и я получаю эту ошибку:

Методы привязки данных, такие как Eval (), XPath () и Bind (), могут использоваться только в контексте элемента управления привязкой данных.

КАК я могу использовать это значение в выражении if ???


person AllStar11    schedule 10.03.2010    source источник


Ответы (1)


Вам нужно будет обработать ItemDataBound и вручную обработайте там значения.

Вот как я могу подойти к проблеме с этим ретранслятором:

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="HandleQuestionType">
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Eval("Question_Number") %>' />
        <%#Eval("Question_Desc")%>
        <asp:PlaceHolder ID="phQuestions" runat="server" />
    </ItemTemplate>
</asp:Repeater>

Вот мой обработчик событий для получения возможных ответов на список переключателей:

protected void HandleQuestionType(object sender, RepeaterItemEventArgs e)
{
    // Execute the following logic for Items and Alternating Items.
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var question = e.Item.DataItem as Question;
        var placeHolder = e.Item.FindControl("phQuestions") as PlaceHolder;

        if(question != null && placeHolder != null)
        {
            if(question.Question_Type == QuestionTypeEnum.MultipleChoice)
            {
                var radioList = new RadioButtonList
                                    {
                                        DataTextField = "Answer",
                                        DataValueField = "ID",
                                        DataSource = GetPossibleAnswers()
                                    };

                radioList.DataBind();

                placeHolder.Controls.Add(radioList);
            }
        }
    }
}
person Josh    schedule 10.03.2010
comment
Спасибо, мне это удалось. Теперь я могу вас еще больше узнать и спросить, как бы я подошел к привязке каждой радиокнопки (если она отображается, IE Question_Type = 1) к другой таблице, которая извлекает список всех возможных значений - person AllStar11; 10.03.2010
comment
Я бы порекомендовал использовать заполнитель в вашем ретрансляторе, и во время вашего события ItemDataBind вы могли бы развернуть новый RadioButtonList, добавить его в коллекцию элементов управления заполнителя, а затем установить его источник данных на данные по вашему выбору. Я разработаю пример и опубликую его в ближайшее время. - person Josh; 10.03.2010
comment
Вы заметите, что в моем примере я использовал Enum вместо Int и настраиваемые объекты. Возможно, вы используете таблицы данных, но должны уметь понимать общую идею. - person Josh; 10.03.2010
comment
Еще раз спасибо. Я изменил ваш пример, но сохранил ту же концепцию. У меня проблема с обновлением заполнителя, который у меня есть с обновленной версией в функции HandleQuestionType. Я знаю, что все переключатели и список заполняются правильно при отладке, однако похоже, что заполнитель не обновляется. Какие-либо предложения? - person AllStar11; 10.03.2010
comment
Убедитесь, что у вас есть тег runat = server и что вы обязательно добавляете RadioButtonList в коллекцию элементов управления заполнителя. Если вы хотите, вы можете следить за моим профилем в моей учетной записи и в профиле blogger, отправьте мне электронное письмо со своим источником, и я смогу увидеть, что происходит. - person Josh; 11.03.2010