【问题标题】:Control caused the post back控制导致回帖
【发布时间】:2011-08-02 07:15:51
【问题描述】:

我有一个包含下拉列表的表单, 在索引更改方法上,我将使用用户选择的参数调用我的用户控件类 .cs,当我将代码放入索引更改时,如下所示,它不起作用,这是正常行为:

 protected void ResourceTypesDDL_SelectedIndexChanged(object sender, EventArgs e)
    {
        ....
        MyUsercontrol c = new MyUSercontrol(....);
        this.panel.controls.add(c);
    } 

这就是为什么我必须将代码放在我的 onload 方法中,但问题是我怎么知道是否是导致回发的 ddl?有属性吗?还是我应该使用 page.Request.Params.Get("__EVENTTARGET") 技术? 非常感谢!

【问题讨论】:

  • 将此代码放在事件处理程序中应该可以正常工作,但是当您向树动态添加控件时,您还必须在每个 other 的页面初始化中调用它i> 回发。将用户控件添加到标记然后只需切换Visible 属性,或者如果需要多个控件,则使用Repeater 可能会容易十亿倍。
  • 所以我把我的代码放在 init 里面,并添加一个转发器,并且没有 selectedIndexChanged 方法?
  • 如果您需要一个控件的多个实例,Repeater 是一种简单的方法。假设您在这些控件中显示一些数据,将这些数据保存在列表中(例如List<MyData>),其中MyData 是包含您的数据的类。在每个页面加载或初始化时将此数据绑定到转发器。在SelectedIndexChanged 事件中,将一个项目添加到列表中。将列表存储在Session 中。不再需要繁琐的动态控制代码!
  • 或者,如果您想要动态控制路线,这是必不可少的阅读:weblogs.asp.net/infinitiesloop/archive/2006/08/25/…2800_Part-1_2900.aspx
  • @Umar:这取决于我的查询字符串,它并不总是一个用户控制 :)

标签: asp.net user-controls drop-down-menu postback


【解决方案1】:

如果你的MyUserControl 真的是用户控制的,这意味着.ascx 文件,你应该使用这个:

Page.LoadControl("~/Controls/MyUserControl.ascx")

而不是直接调用构造函数来创建控件的实例。

protected void ResourceTypesDDL_SelectedIndexChanged(object sender, EventArgs e) {
        ....
        var c = Page.LoadControl("~/Controls/MyUserControl.ascx");
        this.panel.controls.add(c); 
}

编辑:

但是,当然,在每隔一个回帖之后,你就会失去这种控制。因此,您还应该确保在 OnLoad 事件期间创建所有动态控件。

【讨论】:

    【解决方案2】:

    在下拉列表中设置属性 autoPostBack=true 以使页面回发

    或者使用下面的函数来获取page_load上的回发控件

    private string GetPostBackControl()
        {
            string retVal = string.Empty;
            try
            {
                string ctrlname = Page.Request.Params.Get("__EVENTTARGET");
                if (ctrlname != null && ctrlname != string.Empty)
                {
                    Control ctrl = this.Page.FindControl(ctrlname);
                    if (ctrl != null)
                    {
                        retVal = ctrl.ID;
                    }
                }
            }
            catch (Exception ex) { ManageException(ex, ShowGeneralErrorMessage); }
    
            return retVal;
        }
    

    【讨论】:

    • 它是后备,没有问题,但是当我在 indexchanged 方法中创建我的用户控制时,它不起作用,当我把它放在 onload 方法中时它正在工作
    • 好的,那么你上面的方法返回控件的服务器端id来检查这是否是导致回发的下拉列表
    【解决方案3】:

    尝试设置下拉列表的AutoPostBack="True"属性。设置此属性后,当您选择列表中的项目时,它将自动执行回发,并且您的事件 ResourceTypesDDL_SelectedIndexChanged 将被触发。

    【讨论】:

    • 它是后备,没有问题,但是当我在 indexchanged 方法中创建我的用户控制时,它不起作用,当我把它放在 onload 方法中时它正在工作
    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 2017-08-01
    • 2023-03-07
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多