【问题标题】:pass variable to the user control将变量传递给用户控件
【发布时间】:2012-02-10 14:45:19
【问题描述】:

我创建了一个用户控件,用于级联两个下拉列表“province”和“city”。但是每次我运行它时,错误消息都会说“发生'System.StackOverflowException'类型的未处理异常” 这是我的用户控制代码

public partial class cascadingdropdownlist : System.Web.UI.UserControl
{
    public string province_selectedvalue
    {

        set
        {
            string province_selectedvalue = value;
        }
        get
        {
            return city_selectedvalue;
        }
    }

    public string city_selectedvalue
    {
        set
        {
            string city_selectedvalue = value;
        }
        get
        {
            return city_selectedvalue;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        string a = province_selectedvalue;
        ............
    }

}

在主页中

<uc1:cascadingdropdownlist ID="province_city" runat="server" OnPreLoad="province_city_OnPreLoad"/>

后面的代码是

protected void province_city_OnPreLoad(object sender, EventArgs e)
    {
        province_city.province_selectedvalue = myReader["Province/State"].ToString();
        province_city.city_selectedvalue = myReader["City"].ToString();
    }

调用用户控件的province_selectedvalue.get方法出错。为什么我不明白为什么?谁能帮帮我,非常感谢

【问题讨论】:

  • 但是如何先运行宿主页面代码然后加载用户控件来传递变量值呢?

标签: asp.net user-controls


【解决方案1】:

问题出在您的财产上:

public string city_selectedvalue 
{ 
    set 
    { 
        string city_selectedvalue = value; 
    } 

一遍又一遍地调用 city_selectedvalue 上的 setter(或 getter!)导致堆栈溢出。

用这个替换你的属性

public string city_selectedvalue { get; set; }

我还认为您可以对 Province_selectedvalue 做同样的事情,但它的 getter 指的是 city_selectedvalue - 对吗?

【讨论】:

  • 确实我认为问题出在 getter 上,因为 setter 不会调用自己。无论如何使用自动属性将解决问题。
  • 谢谢,错误消失了,但还有一个问题,我想先在主机页面中使用 OnPreLoad 设置province_selectedvalue(可能是另一种方法)。看来还是先加载用户控件,所以“province_selectedvalue”这个值是空的
  • 啊,这可能与控件与页面的生命周期有关。页面的 OnLoad 事件在控件的 OnLoad 之后触发,因此您必须考虑到这一点。 msdn.microsoft.com/en-us/library/ms178472.aspx
【解决方案2】:

您收到该错误是因为代码处于不定式循环中。当您调用province_selectedvalue.get 时,您调用的是city_selectedvalue get。而且您认为您正在调用的变量中的属性具有相同的名称,因此它一遍又一遍地调用相同的名称。

把你的代码改成

public string city_selectedvalue { get; set; }

还有

public string province_selectedvalue { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2017-04-18
    相关资源
    最近更新 更多