【发布时间】:2011-09-29 21:39:09
【问题描述】:
标题有点拗口,但我有点卡在这个问题上。
我有一个搜索结果页面,其中有一个自定义控件,该控件具有 Repeater。转发器中的ItemTemplate 是PlaceHolder,因此我可以以特定格式构造项目;更具体地说,我有一串以Disease1|disease2|disease3 形式出现的“疾病”,需要为每种疾病提供链接。
现在是一些代码:
以下是SearchResultControl.ascx
<asp:Panel ID="SearchResultPanel" runat="server" ScrollBars="Auto">
<asp:Repeater ID="Repeater1" runat="server"
onitemcreated="Repeater1_ItemCreated"
onitemcommand="Repeater1_ItemCommand">
<ItemTemplate>
<asp:PlaceHolder ID="ItemTemplatePlaceHolder" runat="server">
</asp:PlaceHolder>
</ItemTemplate>
<SeparatorTemplate>
<tr>
<td colspan="6"><hr /></td>
</tr>
</SeparatorTemplate>
</asp:Repeater>
</asp:Panel>
背后的代码:SearchResultControl.ascx.cs
protected void Repeater1_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.DataItem != null)
{
PlaceHolder placeHolder = e.Item.FindControl("ItemTemplatePlaceHolder") as PlaceHolder;
Control searchResultItem = Page.LoadControl("SearchResultItem.ascx");
DataRow row = (e.Item.DataItem as DataRowView).Row;
if (row != null)
{
string diseaseState = row["DiseaseStates"] as string;
searchResultItem.GetType().GetProperty("DiseaseStates").SetValue(searchResultItem, diseaseState, null);
placeHolder.Controls.Add(searchResultItem);
}
}
}
(完全公开,我从this question得到这个想法)
SetValue 调用 SearchResultItem 中的 DiseaseStates 属性,该属性又调用以下方法来构建链接、设置文本和事件:
private void BuildDiseaseStateLabels(string diseaseStates)
{
PlaceHolder placeHolder = FindControl("DiseaseStatePlaceHolder") as PlaceHolder;
string[] diseaseStateSplit = diseaseStates.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
int count = diseaseStateSplit.Length;
foreach (string diseaseState in diseaseStateSplit)
{
LinkButton diseaseStateLink = new LinkButton();
diseaseStateLink.Text = diseaseState;
//diseaseStateLink.Click += new EventHandler(OnDiseaseStateLinkClick);
diseaseStateLink.CommandArgument = "<%# Eval(\"PatientID\")+ \";\" + Eval(\"PatientStatus\")+ \";\" + Eval(\"Age\")+ \";\" + Eval(\"DiseaseStates\")%>";
diseaseStateLink.CommandName = "OnDiseaseStateLinkClick";
//diseaseStateLink.Command += new CommandEventHandler(OnDiseaseStateLinkClick);
placeHolder.Controls.Add(diseaseStateLink);
if (count != 0)
{
Label splitLabel = new Label();
splitLabel.Text = "|";
placeHolder.Controls.Add(splitLabel);
}
}
}
这是 SearchResultItem
的布局<div id="SearchResultItemDiv" class="MainSearchResultItem">
<asp:PlaceHolder ID="DiseaseStatePlaceHolder" runat="server">
</asp:PlaceHolder>
</div>
最初我尝试设置Click 事件,但这根本不起作用。然后我设置了CommandArgument 和CommandName,但这似乎没有奏效。我认为可能需要设置 Command 事件,但同样没有运气。我应该注意,当点击链接时,SearchResultControl.ascx.cs 中的Repeater1_ItemCreated 会被调用。但由于e.Item.DataItem 中没有数据,所以我丢失了结果。
在关于同一问题的questions 之一中,建议添加OnItemCommand,但即使这样也不会被调用。
我还阅读了A Stumper of an ASP.NET Question 和A Stumper of an ASP.NET Question: SOLVED!,但无济于事。
我可能做错了什么?所有正确的事件连接似乎都在那里,我正在检查IsPostBack,而不是再次检查DataBind()。 blaaargharaggh
非常感谢您的帮助。
【问题讨论】:
-
对于其他可能属于此问题的人,请查看此答案stackoverflow.com/a/33022709/447558