想用repeater生成無限分類,參考網上資料后決定這樣做:最頂級分類使用固定的repeater控制元件,下屬的分類都用動態生成的repeater控制元件,生成的分類放在一個table中,一個類別一行,帶一個按鈕,按鈕執行洗掉動作.寫好之后發現,分類層次可以實作無限分類要求,但是只有最頂級分類,也就是那個固定repeater控制元件里的按鈕可以執行動作,動態生成的repeater中系結的按鈕無法執行洗掉動作,而且一點擊,除了最頂級分類外,其他各級分類都消失了.如何處理,請大佬幫忙?




代碼如下:
前臺html代碼:
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound" OnItemCommand="Repeater1_ItemCommand">
<HeaderTemplate>
<table class="tablelist">
<thead>
<tr>
<th width="10%">編號</th>
<th width="10%">分類樹</th>
<th width="40%">欄目名稱</th>
<th width="10%">排序值</th>
<th width="10%">欄目型別</th>
<th width="15%">操作</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("classid") %></td>
<td><img src="https://img.uj5u.com/2020/09/25/134219250626245.gif" width="15" height="13"></td>
<td><%# Eval("classname") %></td>
<td><%# Eval("px") %></td>
<td><%# getlmlx(Eval("lmlx").ToString()) %></td>
<td>
<asp:Button ID="btndel" runat="server" Text="洗掉" CommandArgument='<%# Eval("classid") %>' CommandName="del" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
后臺cs代碼:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DbUtility du = new DbUtility(cnstr, DbProviderType.OleDb);
string str = "Select classid,classname,px,lmlx From [Class] where fatherid='0' order by px desc, classid";
DataTable dt = du.ExecuteDataTable(str, null);
Repeater1.DataSource = dt;
Repeater1.DataBind();
}
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
string id = e.CommandArgument.ToString();
switch (e.CommandName)
{
case "del":
Response.Write("<script>alert('OK1!洗掉成功" + id + ".');</script>");
break;
}
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
ListInnerCategory(e.Item, drv["classid"].ToString());
}
}
private int currentLevel = 0;
private void ListInnerCategory(RepeaterItem item, string ID)
{
string str = "Select count(*) From [Class] where fatherid=@cid ";
DbUtility du = new DbUtility(cnstr, DbProviderType.OleDb);
DbParameter[] pars = new DbParameter[]{
du.CreateDbParameter("@cid",ID)
};
int hasc =Convert.ToInt32(du.ExecuteScalar(str, pars));
if (hasc>0)
{
currentLevel++;
string str2 = "Select classid,classname,px,lmlx From [Class] where fatherid=@cid order by px desc, classid";
DbParameter[] pars2 = new DbParameter[]{
du.CreateDbParameter("@cid",ID)
};
DataTable dt = du.ExecuteDataTable(str2, pars2);
Repeater rep = new Repeater();
CategoryTemplate template = new CategoryTemplate(currentLevel);
rep.ItemTemplate = template;
rep.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound);
rep.ItemCommand += new RepeaterCommandEventHandler(rep_ItemCommand);
rep.DataSource = dt;
rep.DataBind();
item.Controls.Add(rep);
currentLevel--;
}
}
protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
TableRow tr = (TableRow)e.Item.FindControl("tr2");
if (tr != null)
{
TableCell td1 = (TableCell)e.Item.FindControl("cid");
td1.Text = drv["classid"].ToString();
TableCell td2 = (TableCell)e.Item.FindControl("cpic");
td2.Text = @"<img src='https://img.uj5u.com/2020/09/25/134219250626246.gif' width='20' height='20'>";
TableCell td3 = (TableCell)e.Item.FindControl("cmc");
td3.Text = drv["classname"].ToString();
TableCell td4 = (TableCell)e.Item.FindControl("cpx");
td4.Text = drv["px"].ToString();
TableCell td5 = (TableCell)e.Item.FindControl("clx");
td5.Text = getlmlx(drv["lmlx"].ToString());
TableCell td6 = (TableCell)e.Item.FindControl("cop");
if (td6 != null)
{
Button btndel = (Button)e.Item.FindControl("btndel2");
btndel.CommandArgument = drv["classid"].ToString();
}
ListInnerCategory(e.Item, drv["classid"].ToString());
}
}
}
protected void rep_ItemCommand(object source, RepeaterCommandEventArgs e)
{
string id = e.CommandArgument.ToString();
switch (e.CommandName)
{
case "del2":
Response.Write("<script>alert('OK2!洗掉成功"+ id +".');</script>");
break;
}
}
repeater模板代碼:
private int currentLevel;
public CategoryTemplate(int level)
{
currentLevel = level;
}
public void InstantiateIn(Control container)
{
TableRow tr = new TableRow();
tr.ID = "tr2";
TableCell td1 = new TableCell();
td1.ID = "cid";
tr.Controls.Add(td1);
TableCell td2 = new TableCell();
td2.ID = "cpic";
tr.Controls.Add(td2);
TableCell td3 = new TableCell();
td3.ID = "cmc";
td3.Attributes.Add("style", "text-indent:" + (currentLevel * 20) + "px;");
tr.Controls.Add(td3);
TableCell td4 = new TableCell();
td4.ID = "cpx";
tr.Controls.Add(td4);
TableCell td5 = new TableCell();
td5.ID = "clx";
tr.Controls.Add(td5);
TableCell td6 = new TableCell();
td6.ID = "cop";
Button btndel = new Button();
btndel.ID = "btndel2";
btndel.Text = "洗掉";
btndel.CommandName = "del2";
td6.Controls.Add(btndel);
tr.Controls.Add(td6);
container.Controls.Add(tr);
}
uj5u.com熱心網友回復:
Page_Load里面得有恢復動態創建的動作,然后注意設定id什么的得一致uj5u.com熱心網友回復:
該怎么做呢?如果我去掉if(!ispostback),發現點擊下屬分類的按鈕正常執行,點擊頂級分類的按鈕卻發生錯誤了,報表回發或回呼引數無效
uj5u.com熱心網友回復:
現在看到這種代碼就感覺頭大, 都19年了, 換一種思維 做 web程式吧,繼續研究這個沒有意義的,已經過時好久了uj5u.com熱心網友回復:
表示已經看不懂了
uj5u.com熱心網友回復:
水平不夠,無力解決次難題.難道真的要放棄?轉載請註明出處,本文鏈接:https://www.uj5u.com/net/123738.html
標籤:ASP.NET
上一篇:關于定義VB.net頁面變數
