【问题标题】:Is it possible to prevent postback when changing the GridView Paging Index?更改 GridView 分页索引时是否可以防止回发?
【发布时间】:2020-06-10 23:40:38
【问题描述】:

我正在尝试使用 ASP C# 创建自己的在线测验网站。

我尝试将数据库中的问题绑定到gridview,并将gridview 的页面大小设置为1。 然后我尝试将答案选项(4 选项)拉入radioButton

但是当我试图从gridview 的第一页移动到另一页时,检查的值丢失了。我知道那是因为当我们更改gridview 页面时,它会执行postback

我的问题是:

  1. 为什么我无法从 CodeBehind 访问我的 RadioButton?是因为在更新面板里面吗?
  2. 如果我们想在不使用postback 的情况下在gridview 中更改页面索引,是否有可能?或者,
  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();
    }

感谢您的任何帮助和建议。

【问题讨论】:

  • 更改索引时是否尝试过传递复选框值?
  • 我无法从后面的代码访问我的 RadioButton,编辑了我的问题。为什么我无法获得我的 RadioButton ID ?请帮忙。
  • 这是因为您在 PageIndexChanging 事件中再次调用 BindGrid()。
  • @Atk 是的,我知道。但是如果不再次调用 BindGrid(),如果我更改分页索引,GridView 值不会改变。你有什么建议吗?或者如果不使用gridview有什么方法?
  • @RANDY 有很多方法可以实现这一目标。 Whenever checkbox is checked, store that result in a data table along with entire row.在 pageindex 更改事件上,将您的网格绑定到该数据表。

标签: c# asp.net gridview postback


【解决方案1】:

如果sql查询没有变化,那么就不要在post back上做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 上思考,这是不可能的,但如果你让它正确,这不是问题。

【讨论】:

  • 但是第一次Page_Load时需要绑定到gridview..
  • @RANDY 看到这一点 if (!Page.IsPostBack) grdquestions.DataBind(); 这是在第一次加载页面时制作 DataBind 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多