Выпадающий список приводит к gridview
У меня возникли проблемы с получением результатов раскрывающихся списков в виде сетки, и я не нашел полезных статей для кода VB. Я пытаюсь создать сайт для тестов. Пока что у меня есть построение сетки с дополнительным столбцом для выпадающего списка, где будет выбран ответ "истина / ложь". Когда тест завершен, появляется кнопка отправки. Все хорошо, за исключением того, что мне нужно иметь возможность получить результаты каждого раскрывающегося списка после обратной передачи в переменную или массив (каждый тест содержит 10 вопросов), чтобы результаты можно было проверить / оценить. Когда результаты будут определены, я хотел бы отобразить метку на ее месте и соответственно изменить текстовое значение (правильное или неправильное), поэтому мне нужно будет также перечислить их (т.е. label1.text="Correct!", label2.text="Неверно!" и т. д.).
Код пока.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataSource1" BackColor="White" BorderColor="#3366CC"
BorderStyle="None" BorderWidth="1px" CellPadding="1">
<RowStyle BackColor="White" ForeColor="#003399" />
<Columns>
<asp:BoundField DataField="Question" HeaderText="Question"
SortExpression="Question" />
<asp:TemplateField HeaderText="Answer">
<ItemTemplate>
<% If Not IsPostBack Then%>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlAnswer"
DataTextField="torf" DataValueField="torf">
</asp:DropDownList>
<%Else%>
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<%End If%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
<PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
<SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
<HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
</asp:GridView>
Предыдущий код загружает 10 строк, 2 столбца (column1:Question | column2-[DropDownLists]:Answer). Я новичок, когда дело доходит до разработки, поэтому, если вам нужна дополнительная информация, дайте мне знать.
3 ответа
Вот как я справился с этим: создал приватную переменную на уровне страницы для хранения нашего списка правильных / неправильных значений. Приватные ответы в виде нового списка (логического) 'создает строго типизированный список значений t/f.
в Page.Load
Если IsPostBack, то "итерация по каждой строке для каждого gridRow. Как GridViewRow в GridView1.Rows" получает выбранное значение для этого ответа. Слабый ответ в виде string = CType(gridRow.FindControl("DropDownList1"),DropDownList).SelectedValue "добавить этот ответ в список ответов. Добавить (IsCorrectAnswer(ответ)) следующий конец, если
функция IsCorrectAnswer определяет, является ли правильный ответ на этот вопрос верным, и возвращает логическое значение. Вам нужно написать эту функцию, чтобы удовлетворить ваши потребности.
в обработчике Button1.Click
'rowCounter будет действовать как индекс для ответов Dim rowCounter как Integer = 0 Для каждого gridRow как GridViewRow в GridView1.Rows 'grid_RowDataBound обрабатывает привязку одной строки grid_RowDataBound(gridRow, rowCounter) rowCounter+=1 Next
в конце концов
Private Sub grid_RowDataBound(gridRow как GridViewRow, rowCounter как Integer) 'делает раскрывающийся список невидимым CType(gridRow.FindControl("DropDownList1"),DropDownList).Visible = False ", потому что мы будем работать с двумя свойствами метки, я толкну сначала в переменной для простоты доступа. Dim label As Label = CType(gridRow.FindControl("Label1"),Label) 'установить метку в видимую метку.Visible = True ' установить текстовую метку. Текст = Iif(ответы (rowCounter),"Правильный", "Неверный") End Sub
У кого-то, возможно, есть более чистое решение, чем это, но я знаю, что это работает, по крайней мере, насколько я понимаю проблему, с которой вы сталкиваетесь. Удачи
Как насчет привязки атрибута Visible к Page.IsPostBack
(обратите внимание, что это в C#, так как я не знаком с синтаксисом для VB.NET... Я уверен, что что-то подобное будет работать):
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlAnswer"
DataTextField="torf" DataValueField="torf" Visible='<%# !Page.IsPostBack %/>></asp:DropDownList>
<asp:Label ID="Label1" runat="server" Text="" Visible='<%# Page.IsPostBack %/></asp:Label>
</ItemTemplate>
Проверьте событие RowDataBound объекта gridview. Он принимает два параметра: (byval отправитель как Object, byval e как GridViewRowEventArgs). С его помощью вы можете установить значение метки в каждой строке как "Правильно" или "Неправильно" при обратной передаче.
см. пример на http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx для получения дополнительной информации
Что касается получения ответов в переменную, вот несколько вариантов
1) проверьте состояние. Это имеет некоторые накладные расходы, так что будьте осторожны с этим. 2) сохранить данные в объекте Session