Создание динамической анкеты в ASP.Net - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь выполнить тест;набор вопросов и ответов, где у каждого вопроса есть несколько вариантов выбора (список переключателей).Все вопросы и возможные ответы хранятся в базе данных.Это очень просто реализовать с помощью повторителя, если все вопросы один за другим, но я должен отображать их по одному, как мастер.

Я пытался использовать комбинацию мастера и повторителя, нополучить кучу ошибок (перечисленных ниже).Есть ли способ создать это;Я не ищу код, просто идеи о том, как это сделать.

Это то, что я устал (и не смог):

<asp:Repeater runat="server" ID="rptBronzeTest">
    <HeaderTemplate>
        <asp:Wizard 
            ID="wizTest" 
            runat="server" 
            ActiveStepIndex="0"
            DisplaySideBar="false" 
            OnNextButtonClick="wizTest_NextButtonClick" >
            <WizardSteps>                       
    </HeaderTemplate>

    <ItemTemplate>
        <asp:WizardStep ID="wsStep" runat="server" StepType='<%# Container.ItemIndex == 0  ? "Start" : (Container.ItemIndex == ((IList)((Repeater)Container.Parent).DataSource).Count-1 ? "Finish" : "Step"%>'>
            <asp:HiddenField runat="server" ID="hfQuestionID" Value='<%# Eval("QuestionID")%>' />
            <div class="row">
                <!-- QuestionID, AnswerID, TrackID, QuestionText, QuestionOrder, NumOptions -->
                <div class="col-centered col-sm-12"><label><%# Eval("QuestionOrder")%>.&nbsp;<%# Eval("QuestionText")%></label></div>
            </div>
            <div class="survey-question">
                <div class="row" style="padding-left:20px;">
                    <!-- QuestionID, AnswerID, Answer, AnswerOrder -->
                    <asp:RadioButtonList runat="server" ID="rblAnswers" RepeatDirection="Vertical" DataTextField="Answer" DataValueField="AnswerID"></asp:RadioButtonList>
                </div>
            </div>
        </asp:WizardStep>
    </ItemTemplate>

    <FooterTemplate>
                <asp:WizardStep ID="wsComplete" runat="server" StepType="Complete">

                </asp:WizardStep>
            </WizardSteps>
            <FinishNavigationTemplate>
                <asp:ImageButton runat="server" ID="ibFinishPrev" 
                    ImageUrl="~/assets/images/Left_small.gif" 
                    CommandName="MovePrevious" 
                    CausesValidation="false"/>
                <asp:ImageButton runat="server" ID="ibFinishComplete" 
                    ImageUrl="~/assets/images/Check_small.gif" 
                    OnClientClick="if(confirm('This will submit your test. Continue?')){ disableSubmit();}else return false;" 
                    CommandName="Finish" 
                    OnClick="ibFinishComplete_Click" />
            </FinishNavigationTemplate>
        </asp:Wizard>

    </FooterTemplate>
</asp:Repeater>

Это приводит к следующей ошибке:

System.Web.UI.WebControls.WizardStepCollection must have items of type 'System.Web.UI.WebControls.WizardStepBase'. 'ItemTemplate' is of type 'System.Web.UI.HtmlControls.HtmlGenericControl'.

Если я удаляю мастера и просто использую ретранслятор, все вопросы / ответы отображаются корректно, один за другим.

Обновление

Попытка добавлениямастер динамически на стороне сервера для заполнителя.Хотя трассировка показывает, что он добавляет все шаги мастера, когда я запускаю его, я вижу вопрос 1 и возможные ответы, нажимаю «Далее» и ничего!

if (!Page.IsPostBack)
{
    dtQuestions = GetTestQuestionsByTrack();

    Wizard wzTest = new Wizard();
    wzTest.ID = "wizBronzeTest";
    wzTest.ActiveStepIndex = 0;
    wzTest.CellPadding = 2;
    wzTest.StartNextButtonType = ButtonType.Image;
    wzTest.StartNextButtonImageUrl = "~/assets/images/Right_small.gif";
    wzTest.StepNextButtonType = ButtonType.Image;
    wzTest.StepNextButtonImageUrl = "~/assets/images/Right_small.gif";
    wzTest.StepPreviousButtonType = ButtonType.Image;
    wzTest.StepPreviousButtonImageUrl = "~/assets/images/Left_small.gif";
    wzTest.CancelButtonImageUrl = "~/assets/images/Cancel.png";
    wzTest.CancelButtonType = ButtonType.Image;
    wzTest.DisplaySideBar = false;
    wzTest.NextButtonClick += wizBronzeTest_NextButtonClick;

    for (int i = 0; i <= dtQuestions.Rows.Count - 1; i++)
    {
        DataRow dr = dtQuestions.Rows[i];
        WizardStepBase newStep = new WizardStep();
        newStep.ID = dtQuestions.Rows[i]["QuestionID"].ToString();
        newStep.StepType = i == 0 ? WizardStepType.Start : WizardStepType.Step;

        HiddenField hfQuestionID = new HiddenField();
        string sQuestionID = dr["QuestionID"].ToString();
        hfQuestionID.Value = sQuestionID;

        string sQuestion = dr["QuestionOrder"].ToString() + ". " + dr["QuestionText"].ToString();
        Label lbl = new Label();
        lbl.CssClass = "form-control-label";
        lbl.Text = sQuestion;

        HtmlGenericControl div1 = new HtmlGenericControl();
        div1.Attributes.Add("class", "row");

        HtmlGenericControl div2 = new HtmlGenericControl();
        div2.Attributes.Add("class", "col-centered col-sm-12");
        div2.InnerHtml = "<label>" + sQuestion + "</label>";

        div1.Controls.Add(div2);

        RadioButtonList rblAnswers = new RadioButtonList();
        rblAnswers.ID = "rblAnswers";
        rblAnswers.RepeatDirection = RepeatDirection.Vertical;
        rblAnswers.DataTextField = "Answer";
        rblAnswers.DataValueField = "AnswerID";
        DataTable dtAnsers = AU_BronzeQuestionAnswer.GetQuestionAnswersByQuestionID(int.Parse(sQuestionID));
        rblAnswers.DataSource = dtAnsers;
        rblAnswers.DataBind();

        newStep.Controls.Add(div1);
        newStep.Controls.Add(rblAnswers);
        wzTest.WizardSteps.Add(newStep);
    }
    phTest.Controls.Add(wzTest);

}
...