我正在尝试加载/重新加载基于DropDownList
的OnSelectedIndexChanged
事件的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事件,它的工作)。
您需要在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
}