Как рассчитать несколько выбранных Datavalue из списка в веб-формах asp.net - PullRequest
0 голосов
/ 11 ноября 2018

В основном я пытаюсь создать приложение для викторины (вопросы с несколькими вариантами ответов) и хочу вычислить общее количество правильных ответов на основе значения данных из базы данных. Поэтому я использовал Listbox внутри повторителя, чтобы показать варианты выбора, которые выглядят следующим образом:

            <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">                
            <ItemTemplate>
              Q-<%# Eval("Question_Text") %><br />

                <asp:ListBox ID="ListBox1" runat="server" CssClass="listboxCSS"></asp:ListBox><br /> <br />
            </ItemTemplate>
        </asp:Repeater>

и код C # выглядят так:

    protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        SqlCalss Obj = new SqlCalss();
        Repeater1.DataSource = Obj.ExecuteCmdSelect("SELECT * from Questions where ExamId=1");
        Repeater1.DataBind();
    }
protected void Repeater1_ItemDataBound(object source, RepeaterItemEventArgs e)
{

    string choice = DataBinder.Eval(e.Item.DataItem, "Question_Id").ToString();
    SqlCalss Obj = new SqlCalss();
    DataSet Ds = new DataSet();
    Ds = Obj.ExecuteCmdSelect("SELECT * from Choices where QuestionId="+choice);

    ListBox ListBox1 = (ListBox) (e.Item.FindControl("ListBox1"));
    ListBox1.DataSource = Ds;
    ListBox1.DataTextField = "Choice_Text";
    ListBox1.DataValueField = "Answer";
    ListBox1.DataBind();}

Код работает хорошо, он показывает несколько вопросов (зависит от теста) с несколькими вариантами ответов на каждый вопрос, отображаемый в списке. Теперь для каждого вопроса DataValueField может иметь только одно из двух значений (0 = неверно, 1 = правильно). Кроме того, общее количество вопросов отличается от одного опроса к другому, поэтому я не знаю, сколько там списков.

Как добавить кнопку, которая вычисляет все выбранные значения данных, чтобы показать общее количество правильных ответов? Я попробовал этот код:

   int x = Repeater1.Controls.Count(x => x.DataValueField == 1);

и это

int numCorrect = Repeater1.Items.Count(x => x.DataValueField == 1);

Edit:

Когда я запускаю веб-страницу, например, викторину, в которой есть два вопроса (каждый вопрос имеет четыре варианта в списке) Я обнаружил, что когда я просматриваю исходный текст веб-страницы, он создает два списка с одинаковым именем, например так:

                    <select size="4" name="Repeater1$ctl00$ListBox1" id="Repeater1_ListBox1_0" class="listboxCSS">
....
                    <select size="4" name="Repeater1$ctl01$ListBox1" id="Repeater1_ListBox1_1" class="listboxCSS">

и я выяснил, как получить значение первого с помощью кода, подобного этому:

  ListBox ListBox1 = (ListBox)this.FindControl("Repeater1$ctl00$ListBox1");
  Response.Write(ListBox1.SelectedValue.ToString());

В любом случае, я могу получить все значения списков с одинаковыми именами?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 12 ноября 2018

Спасибо всем! Я только что нашел ответ на свою проблему, которая заключается в получении всех списков на веб-странице с использованием следующего кода:

    private void GetControlList<T>(ControlCollection controlCollection, List<T> resultCollection)
where T : Control
    {
        foreach (Control control in controlCollection)
        {
            //if (control.GetType() == typeof(T))
            if (control is T) // This is cleaner
                resultCollection.Add((T)control);

            if (control.HasControls())
                GetControlList(control.Controls, resultCollection);
        }
    }

Тогда я могу получить значения, используя следующее:

   int s=0;
List<ListBox> allControls = new List<ListBox>();
        GetControlList<ListBox>(Page.Controls, allControls);
foreach (var childControl in allControls)
        {
            s +=  Int32.Parse( childControl.SelectedValue);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...