如何基于下拉列表的选择动态加载GridView

本文关键字:动态 加载 GridView 选择 何基于 下拉列表 | 更新日期: 2023-09-27 18:18:06

我正在尝试加载/重新加载基于DropDownListOnSelectedIndexChanged事件的GridView。ddl将AutoPostBack设置为true,但仍然无法加载网格,除非我将其封装在UpdatePanel中。但一旦我这样做,我的FileUpload控件停止工作…这个问题的最佳解决方案是什么?

**编辑**相关代码:

aspx文件
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
        <asp:UpdatePanel ID="upProva" runat="server">
                <ContentTemplate>
                <%--user control for data selection--%>
                <asp:DropDownList ID="ddlAula" runat="server" DataTextField="nmAula" DataValueField="idAula"
                    CssClass="medio" Enabled="false" AutoPostBack="true" OnSelectedIndexChanged="ddlAula_OnSelectedIndexChanged">
                </asp:DropDownList>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:GridView ID="gvQuestoes" runat="server" AutoGenerateColumns="False" CssClass="gv"
            AllowSorting="false" DataKeyNames="idQuestao" OnRowCommand="gvQuestao_RowCommand">
            <Columns>
                <%--(...)--%>
            </Columns>
        </asp:GridView>
<asp:Button ID="btnSalvar" runat="server" ToolTip="Salvar" CssClass="botao40 salv40"
                    OnClick="btnSalvar_Click" ValidationGroup="trabalho" />
        <asp:FileUpload ID="fuAnexo" runat="server" CssClass="fileOriginal" />
    </asp:Content>
后台代码

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        btnArquivo.OnClientClick = "document.getElementById('" + fuAnexo.ClientID + "').click(); return false;";
        txtAnexo.Attributes.Add("onclick", "document.getElementById('" + fuAnexo.ClientID + "').click(); return false;");
        fuAnexo.Attributes.Add("onchange", "document.getElementById('" + txtAnexo.ClientID + "').value = this.value;");
    }
}
protected void ddlAula_OnSelectedIndexChanged(object sender, EventArgs e)
{
    gvQuestoes.DataSource = Questao.CarregarPorAula(Int32.Parse(ddlAula.SelectedValue));
    gvQuestoes.DataBind();
}

DataSource/Databinding是正确的(我知道,因为我已经添加了一个按钮到页面,并使用相同的绑定代码在butt_click事件,它的工作)。

如何基于下拉列表的选择动态加载GridView

您需要在OnSelectedIndexChanged事件中重新绑定gridview。就像

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
  //Do your processing logic
  gridview1.DataSource = new_modified_datasource;
  gridview1.DataBind();  
}

我发现了一个相当简单的PostBackTrigger:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
        <asp:UpdatePanel ID="upProva" runat="server">
                <ContentTemplate>
                <%--user control for data selection--%>
                <asp:DropDownList ID="ddlAula" runat="server" DataTextField="nmAula" DataValueField="idAula"
                    CssClass="medio" Enabled="false" AutoPostBack="true" OnSelectedIndexChanged="ddlAula_OnSelectedIndexChanged">
                </asp:DropDownList>
        <asp:GridView ID="gvQuestoes" runat="server" AutoGenerateColumns="False" CssClass="gv"
            AllowSorting="false" DataKeyNames="idQuestao" OnRowCommand="gvQuestao_RowCommand">
            <Columns>
                <%--(...)--%>
            </Columns>
        </asp:GridView>
        <asp:FileUpload ID="fuAnexo" runat="server" CssClass="fileOriginal" />
   </ContentTemplate>
    <Triggers>
    <asp:PostBackTrigger ControlID="btnSalvar" />    
    </Triggers>
        </asp:UpdatePanel>
    </asp:Content>

代码中没有任何地方显示如何填充ddlAula。这就是我的答案:你所展示的Page_Load是缩写的,实际上你是在填充ddlAula。此外,您每次都这样做,而不是检查IsPostBack。因此,当您命中ddlAula的事件处理程序时,列表已被重置,您选择的值不再被选中。

如果我的答案是正确的,你需要在Page_Load中添加检查:

if (!IsPostBack)
{
    //populate ddlAula
}