根据标题,我知道我在下面发布的代码是完全便便,这就是我需要你帮助的原因!
我已经花了太多时间进入这个问题,而且要么缺乏经验,还有一个错误,或者我已经搞砸了。
我有一个用户控件,其中包含一个访问ViewState的视图属性,以及两个用户控件,用于显示属性。
在用户控件的page_load中,根据某些属性的值,它将切换控件的可见性:
public partial class PatientStatus : System.Web.UI.UserControl
{
public string PatientName { get { return ViewState["PatientName"] as string; } set { ViewState["PatientName"] = value; } }
public bool ClinicianView { get { return Convert.ToBoolean(ViewState["ClinicianView"]); } set { ViewState["ClinicianView"] = value; } }
public string RangeTitle { get { return ViewState["RangeTitle"] as string; } set { ViewState["RangeTitle"] = value; } }
public int? RangeLimitNormSys { get { return ViewState["RangeLimitNormSys"] as int?; } set { ViewState["RangeLimitNormSys"] = value; } }
public int? RangeLimitNormDia { get { return ViewState["RangeLimitNormDia"] as int?; } set { ViewState["RangeLimitNormDia"] = value; } }
protected void Page_Load(object sender, EventArgs e)
{
bool ispostback = IsPostBack;
if (ispostback && ((System.Web.UI.WebControls.Repeater)(this.Parent.Parent)).DataSource != null)
{
object itm = ((RepeaterItem)this.Parent).DataItem;
if (itm is AppointmentRow)
{
AppointmentRow row = itm as AppointmentRow;
PatientName = row.Name;
RangeTitle = row.Range;
RangeLimitNormDia = row.RangeLimitNormDia;
RangeLimitNormSys = row.RangeLimitNormSys;
ispostback = false;
}
else if (itm is ReadingRow)
{
ReadingRow row = itm as ReadingRow;
PatientName = row.Name;
RangeTitle = row.Range;
RangeLimitNormDia = row.RangeLimitNormDia;
RangeLimitNormSys = row.RangeLimitNormSys;
ispostback = false;
}
else if (itm is PatientRow)
{
PatientRow row = itm as PatientRow;
PatientName = row.Name;
RangeTitle = row.Range;
RangeLimitNormDia = row.RangeLimitNormDia;
RangeLimitNormSys = row.RangeLimitNormSys;
ispostback = false;
}
}
if (!ispostback)
{
if (!string.IsNullOrWhiteSpace(RangeTitle))
{
placeHolder.Visible = true;
literalNA.Visible = false;
}
}
}
}
以前,Page_Load事件只包含:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (!string.IsNullOrWhiteSpace(RangeTitle))
{
placeHolder.Visible = true;
literalNA.Visible = false;
}
}
}
但是在回发时,RangeTitle属性始终为null,因此即使删除isPostBack语句,它也不起作用。
解决问题的唯一方法是通过第一段代码真正捏造它。
在父页面的Page_Load上,然后在!isPostBack上调用一个获取数据并将数据绑定到转发器的方法。这很好用。但是在回发中,我调用相同的方法,由于某种原因,用户控件不会填充。
任何想法?
圣诞快乐
GAV株系
修改
回应@jwiscarson
我有一个通过ASP:Repeater生成的表,在ItemTemplate中,我添加了一个包含PlaceHolder和Literal的用户控件。用户控件中还有许多属性。
然后在数据绑定中,我将多个值传递给用户控件(我已尝试使用Eval的OnItemDataBound和内联)。然后在User Control的Page_Load事件中,根据上面的第二个代码块,我首先检查它是否是回发,如果没有,我然后检查Property RangeTitle是否有值。
如果RangeTitle没有值,我会隐藏包含HTML的占位符,该HTML将显示RangeTitle并显示一个显示N / A的文字。
第一次加载页面时,(!isPostBack)工作正常。但是一旦我创建了一个回发,转发器中的用户控件都会恢复为N / A,即使它们的RangeTitle属性有值。
在调试时,我在User Control的Page_Load中设置了一个断点。当我第一次加载页面时,我可以看到我的属性已正确填充。然后在回发时,在UserControl上调用Page_Load并正确填充属性,然后再次调用Page_Load,但这次属性为空。
即
!的IsPostBack UserControl :: Page_Load<正确的数据
的IsPostBack UserControl :: Page_Load<正确的数据 myButton_Click(绑定新数据) UserControl :: Page_Load<没有数据
让事情变得更加混乱。在myButton_Click中调用以绑定数据的方法,就是在Page的Page_Load中调用的完全相同的方法,用于填充转发器!isPostBack
谢谢;)
答案 0 :(得分:0)
我会检查以确保此函数中可以访问DataItem
。我认为您需要收听ItemDataBound
事件并在该事件中执行此工作。
除此之外,很难提出具体的其他建议。我真的不明白为什么你正在做你正在做的事情(如果你在Repeater
中有这些信息,为什么它也需要在ViewState
?)。如果你能解释你这样做的理由,它可能会帮助我和其他任何访问这个问题的人。你说你只是想在页面上显示/隐藏一些特定的项目。这是非常复杂的代码,没有很多合理性的理由。
顺便说一句:你真的,真的需要打破这些代码并思考你想要实现的目标。以下是一些建议:
if
和else if
语句中的范围分隔为返回所需数据的函数。((System.Web.UI.WebControls.Repeater)(this.Parent.Parent)).DataSource != null
等行。单独执行此转换并将其存储在变量中,或者编写一个小函数来检查它。if
这样的语句和对this.Parent.Parent
控件的其他引用都是代码味道。即使在普通网页上,这也会产生代码异味,但是当您将Parent
包含在this.Parent
中时,UserControl
究竟会引用什么?