ASP.NET C#:非静态类设置界面可见性失效问题排查
问题根源:静态成员导致控件引用被共享
你遇到的问题百分之百是因为WhatsMyDay类里的控件字段被定义成了static!静态成员属于类本身,而不是类的每个实例——这意味着所有WhatsMyDay对象都会共享同一个ddlAM、ddlPM和tdTitle引用。
具体发生了什么?
- 你创建第一个
WhatsMyDay实例(周一)时,静态的tdTitle被赋值为tdMondayTitle; - 紧接着创建第二个实例(周二),静态的
tdTitle被覆盖为tdTuesdayTitle; - 遍历
myDays时,第一个实例(周一)调用ShowHideInterface,实际操作的是周二的tdTitle(因为静态字段已经被第二个实例覆盖了); - 最后第二个实例(周二)调用方法时,虽然传入了
false,但前面的错误操作已经干扰了最终结果,导致你的隐藏预期不生效。
修复方案:去掉静态修饰符
把WhatsMyDay类里的控件字段改成实例成员,让每个对象持有自己的控件引用,这样就不会互相干扰了。修正后的代码如下:
public class WhatsMyDay { public WhatsMyDay(DayOfWeek day, DropDownList am, DropDownList pm, HtmlTableCell dTitle) { Day = day; ddlAM = am; ddlPM = pm; tdTitle = dTitle; } public DayOfWeek Day { get; private set; } // 移除static修饰符,改为实例私有属性 private DropDownList ddlAM { get; set; } private DropDownList ddlPM { get; set; } private HtmlTableCell tdTitle { get; set; } public int? AM { get { int value = Convert.ToInt32(ddlAM.SelectedValue); return value == -1 ? null : (int?)value; } } public int? PM { get { int value = Convert.ToInt32(ddlPM.SelectedValue); return value == -1 ? null : (int?)value; } } public void ShowHideInterface(bool visibility) { tdTitle.Visible = visibility; } }
额外优化建议
- 可以给
AM和PM的getter加异常处理(比如判断SelectedValue是否能正确转成int),避免运行时出现转换错误; days和myDays如果不需要跨方法共享,建议改成局部变量或者非静态字段——静态集合在ASP.NET的多线程环境下容易引发线程安全问题。
内容的提问来源于stack exchange,提问作者Mr Smith
相关产品推荐
相关产品推荐

