【问题标题】:post back of Dropdownlist in web user control all other fields become empty在 Web 用户控件中回发 Dropdownlist 所有其他字段都变为空
【发布时间】:2011-12-12 15:41:13
【问题描述】:

我有一个 aspx 页面,其中面板内有占位符

作为

<div>
    <div>
        <div>
            <div>
                <div>
                    <div>
                        <asp:UpdatePanel runat="server" ID="UpdatePanelLinks">
                            <ContentTemplate>
                                <center>
                                    <asp:Button Text="ADD" ID="btnAdd" runat="server" Width="100" OnClick="btnAdd_Click" />&nbsp;
                                    <asp:Button Text="Edit" ID="btnEdit" runat="server" Width="100" OnClick="btnEdit_Click" />&nbsp;
                                    <asp:Button Text="Delete" ID="btnDelete" runat="server" Width="100" OnClick="btnDelete_Click" /></center>
                                <asp:LinkButton ID="usercontroldata" runat="server" Text="Branches" 
                                    OnClick="usercontrol_Click"></asp:LinkButton>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </div>
                </div>
                <div >
                    <asp:LinkButton ID="lnkDepartments" runat="server" Text="Departments" OnClick="lnkDepartments_Click"></asp:LinkButton>
                </div>
                <div >
                </div>
                <div >
                    <asp:LinkButton ID="lnkProjects" runat="server" Text="Projects" OnClick="lnkProjects_Click"></asp:LinkButton>
                </div>
                <div >
                </div>
                <div >
                    &nbsp;
                </div>                       
            </div>
            <div>
                <div>
                    <asp:Label Text="" Visible="false" ID="lblmessage" runat="server" />
                    <div>
                        <asp:UpdatePanel ID="UpdatePanel" runat="server">
                            <Triggers>
                                <asp:AsyncPostBackTrigger ControlID="lnkBranches" EventName="Click" />
                                <asp:AsyncPostBackTrigger ControlID="lnkDepartments" />
                                <asp:AsyncPostBackTrigger ControlID="lnkProjects" />
                                <asp:AsyncPostBackTrigger ControlID="btnAdd" />
                                <asp:AsyncPostBackTrigger ControlID="btnEdit" />
                                <asp:AsyncPostBackTrigger ControlID="btnDelete" />
                            </Triggers>
                            <ContentTemplate>
                                <asp:Panel runat="server" ID="MainPanel">
                                    <div class="padding_branch">
                                        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
                                    </div>
                                </asp:Panel>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="lnkBranches" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="lnkDepartments" />
        <asp:AsyncPostBackTrigger ControlID="lnkProjects" />
        <asp:AsyncPostBackTrigger ControlID="btnAdd" />
        <asp:AsyncPostBackTrigger ControlID="btnEdit" />
        <asp:AsyncPostBackTrigger ControlID="btnDelete" />
    </Triggers>
    <ContentTemplate>
        <asp:Panel runat="server" ID="MainPanel">
            <div >
                <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>                                     
            </div>
        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>    

在 aspx.cs 页面上,我在点击链接时动态添加 Web 用户控件

在添加按钮上点击新的用户控件被加载

 protected void usercontrol_Click(object sender, EventArgs e)
 {
        if (ViewState["controlname"] != null)
        {
            PlaceHolder pl = MainPanel.FindControl(ViewState["controlname"].ToString()) as PlaceHolder;
            if (pl.Controls.Count > 0)
            {
                pl.Controls.RemoveAt(0);
            }
        }

        Control uc = (Control)Page.LoadControl("~/usercontrol_Data.ascx");

        ViewState["path"] = "~/usercontrol_Data.ascx";
        ViewState["controlname"] = "PlaceHolder1";
        ViewState["name"] = "usercontrol";
        PlaceHolder1.Controls.Add(uc);
 }

我还在 Page_Load 上维护 Web 用户控件

        if (Page.IsPostBack)
        {
            if (ViewState["path"] != null)
            {
                Control uc1 = (Control)Page.LoadControl(ViewState["path"].ToString());

                PlaceHolder pl = MainPanel.FindControl(ViewState["controlname"].ToString()) as PlaceHolder;
                pl.Controls.Add(uc1);
            }
        }

当我从用户控件中选择任何选项时,表单用户控件上有一个下拉列表,它会发回,并且所有其他字段对于文本框等都为空。这是第一次发生,下次所有字段都保留在那里的值

请帮忙

谢谢

【问题讨论】:

  • 对于以后的帖子,请考虑将不必要的代码从您发布的摘录中删除。第一个示例中的所有这些 div 让人很难看到发生了什么,并且对功能没有影响。 这只是一个建议。
  • 感谢您的建议,我会记住的

标签: c# asp.net updatepanel


【解决方案1】:

我通过在每次动态加载控件时为控件分配相同的 ID 来做到这一点。这是因为当控件每次获取新 ID 时都会动态添加,这对我来说是个问题

uc1.ID="Web_User_Control_ID";

每次控制负载分配此 ID 时都会解决问题

【讨论】:

    【解决方案2】:

    尝试在您的Page_Load 事件中将Page.IsPostBack 更改为!Page.IsPostback

    【讨论】:

      【解决方案3】:

      动态添加的控件在回发之间保留;您必须在 每个 回发时重新添加动态添加的控件。在每个页面请求上,asp.net 将解析您的 aspx 文件,构建页面的 html 结构,然后通过 ViewState 和发布的值填写任何先前填写的值,然后提供它。就是这样。它永远不会自动重新添加动态添加的内容。

      所以一旦你运行这段代码

      protected void usercontrol_Click(object sender, EventArgs e)
      {
          //...
          Control uc = (Control)Page.LoadControl("~/usercontrol_Data.ascx");
      
          ViewState["path"] = "~/usercontrol_Data.ascx";
          ViewState["controlname"] = "PlaceHolder1";
          ViewState["name"] = "usercontrol";
          PlaceHolder1.Controls.Add(uc);
      }
      

      你需要知道每次用户回帖时都要重新运行它

      【讨论】:

      • 问题是如何重新运行此代码,我在页​​面加载时保持状态,就像我的问题一样。有什么建议吗?
      • 将上面的代码重构为一个新方法;说 LoadMyControl 并在 usercontrol_click 和 Page_Load 事件中调用它。
      • @GurbaxSinghBhangal - Kev 是对的。您需要将此控件添加代码放在一个地方,并在需要时重新调用页面加载
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      相关资源
      最近更新 更多