Можно ли предотвратить обратную передачу при изменении индекса подкачки GridView? - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь создать свой собственный веб-сайт викторины, используя ASP C#.

Я пытался связать вопрос из базы данных в gridview и установить размер страницы gridview в 1. А затем я попытался перетащить вариант ответов (4 варианта) в radioButton.

Но когда я попытался перейти с 1 страницы gridview на другую страницу, проверенное значение потеряно. Я знаю, что из-за того, что когда мы изменили страницу gridview, она выдаст postback.

Мои вопросы:

  1. Почему я не могу получить доступ к своему RadioButton из CodeBehind? Это из-за внутри Updatepanel?
  2. Возможно ли, если мы хотим сделать изменение индекса страницы в gridview без postback? Или,
  3. , есть ли другой вариант, чтобы мое RadioButton проверенное значение не терялось при переходе на следующую страницу (следующий вопрос)?

вот мой код:

** quiz.aspx: **

<asp:UpdatePanel ID="upd1" runat="server">
    <ContentTemplate>
        <asp:GridView ID="grdquestions" runat="server" EnableViewState="true" EnableSortingAndPagingCallbacks="false" OnPageIndexChanging="grdquestions_PageIndexChanging" AutoGenerateColumns="false" DataKeyNames="QuestionId" Width="100%" AllowPaging="True" AllowCustomPaging="False" PageSize="1" ViewStateMode="Enabled">
            <Columns>
                <asp:TemplateField HeaderText="DOJO eQuiz">
                    <ItemTemplate>
                        <table class="tableclass" id='<%#Eval("QuestionId") %>'>
                            <tr>
                                <td><b>Question : <%#Eval("Question") %></b>
                                    <asp:HiddenField ID="hdnquestionId" runat="server" />
                                </td>
                            </tr>
                            <tr>
                                <td>
                                    <table>

                                        <tr style="margin-top: 10px;">

                                            <td>
                                                <table class="tblOptions">
                                                    <tr>
                                                        <td>
                                                            <asp:RadioButton ID="rdOption1" AutoPostBack="true" runat="server" Text='<%#Eval("Option1") %>' GroupName="chcbox" />

                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td>
                                                            <asp:RadioButton ID="rdOption2" runat="server" AutoPostBack="true" Text='<%#Eval("Option2") %>' GroupName="chcbox" />
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td>
                                                            <asp:RadioButton ID="rdOption3" runat="server" AutoPostBack="true" Text='<%#Eval("Option3") %>' GroupName="chcbox" />
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td>
                                                            <asp:RadioButton ID="rdOption4" runat="server" Text='<%#Eval("Option4") %>' GroupName="chcbox" />
                                                        </td>
                                                    </tr>
                                                    <tr>
                                                        <td>
                                                            <asp:Label ID="lbquestionstatus" runat="server"></asp:Label>
                                                        </td>
                                                    </tr>

                                                </table>
                                            </td>
                                        </tr>
                                    </table>
                                </td>
                            </tr>

                        </table>

                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <PagerStyle HorizontalAlign="Center" CssClass="GridPager" />
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

** quiz.aspx.cs **

protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["username"] == null)
        {
            Response.Redirect("Login.aspx");

        }
        else
        {
            if (!Page.IsPostBack)
            {
                BindGrid();

            }
            else
            {
            }
        } 
    }


 public void BindGrid()
    {
        var sess = Session["username"].ToString();
        string a = sess.Substring(sess.Length - 1);

        SqlDataAdapter adp = new SqlDataAdapter("select * from dojoquiz order by " + a + "", ConfigurationManager.ConnectionStrings["dashboardConnectionString"].ToString());
        adp.Fill(dt);

        grdquestions.DataSource = dt;
        grdquestions.DataBind();
    }

protected void grdquestions_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            RadioButtonList rdlstOptions = (RadioButtonList)e.Row.FindControl("rdlstOptions");
            HiddenField hdnquestionId = (HiddenField)e.Row.FindControl("hdnquestionId");
            if (rdlstOptions != null && hdnquestionId != null)
            {
                DataRow[] result = dt.Select("questionid=" + (Convert.ToInt32(hdnquestionId.Value)));
                DataView view = new DataView();
                view.Table = dt;
                view.RowFilter = "questionid=" + (Convert.ToInt32(hdnquestionId.Value));
                if (view.Table.Rows.Count > 0)
                {
                    DataTable dt1 = new DataTable();
                    dt1 = view.ToTable();
                }
            }
        }
    }

    protected void grdquestions_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        grdquestions.PageIndex = e.NewPageIndex;
        this.BindGrid();
    }

Спасибо за любую помощь и предложения.

1 Ответ

0 голосов
/ 27 февраля 2020

Если запрос sql не изменился, не выполняйте DataBind() при обратной отправке, но вам все равно нужно предоставить ему источник данных, чтобы получить данные. Таким образом, ваш код должен быть следующим:

protected void Page_Load(object sender, EventArgs e)
{
    BindGrid();
}

public void BindGrid()
{
    var sess = Session["username"].ToString();
    string a = sess.Substring(sess.Length - 1);

    SqlDataAdapter adp = new SqlDataAdapter("select * from dojoquiz order by " + a + "", ConfigurationManager.ConnectionStrings["dashboardConnectionString"].ToString());
    adp.Fill(dt);

    grdquestions.DataSource = dt;

    if (!Page.IsPostBack)
        grdquestions.DataBind();
}

Невозможно без обратной записи изменить страницу или подумать о GridView, но если вы исправите это, это не проблема.

...