gpt4 book ai didi

c# - 如何遍历 div 以重置链接的委托(delegate)?

转载 作者:太空宇宙 更新时间:2023-11-04 14:01:50 28 4
gpt4 key购买 nike

如果我有这样的方法来动态绘制我的侧边菜单:

private void DrawSideMenu()
{

LinkButton x;
TaskDTO TaskList = new TaskDTO();
List<TaskDTO> List = TaskList.DrawMenu(int.Parse(Session["emp"].ToString()));

HtmlGenericControl myDIV = new HtmlGenericControl("div");
myDIV.ID = "menu8";
HtmlGenericControl myOrderedList = new HtmlGenericControl("ul");//css clss for <ul>
myOrderedList.ID = "orderedList";
myOrderedList.Attributes.Add("class", "task");
HtmlGenericControl listItem1;
string count = "";
foreach (TaskDTO i in List)
{
count = AdjustMenuCount1(i.TaskCode);
x = new LinkButton();
x.ID = i.TaskCode.ToString();
x.Text = i.TaskName + "&nbsp; &nbsp;" + count;
x.Click += new EventHandler(TaskC);
x.Style["FONT-FAMILY"] = "tahoma";
listItem1 = new HtmlGenericControl("li");
listItem1.Attributes.Add("class", "normal");
if (count != "0")
{
listItem1.Controls.Add(x);
myOrderedList.Controls.Add(listItem1);
}
}
myDIV.Controls.Add(myOrderedList);
MenuTD.Controls.Add(myDIV);
Session["SideMenu"] = myDIV;//Save to redraw when page postbacks
}

此方法需要很长时间来绘制我的菜单。所以我在 (!IsPostBack) 中调用了一次并将其保存在 session 中,以便我可以像那样重绘它:

MenuTD.Controls.Add( ((System.Web.UI.Control)(Session["SideMenu"])));

它重绘成功但是当我点击任何链接时它没有触发事件因为我认为不可能保存 x.Click += new EventHandler(TaskC); 在session ,所以我想知道如何遍历我的 session 内容以重置我的链接的委托(delegate)?

最佳答案

这个想法行不通,因为if you're not wiring up the Event Handler every time the page is loaded, it won't run.

如果我们回到最初的问题,您说它很慢。在运行时创建控件不会很慢,这很可能是您创建项目列表的方式:

List<TaskDTO> List = TaskList.DrawMenu(int.Parse(Session["emp"].ToString()));

与其存储完整的菜单,不如尝试将其存储在仅 session 列表中,并像往常一样创建所有控件。如果仅在一页上需要菜单,则使用 ViewState而不是 session 。

更改整个代码也很有意义,因为目前您在代码中硬编码了所有样式和布局设置。在 aspx 中创建所有布局(div、ul、li),在 css 中移动所有样式(例如,您使用“task”类但仍然在代码中设置“tahoma”)。这将简化代码并带来更大的灵 active 。

List<TaskDTO> List = null;

void Page_Load(object sender, EventArgs e)
{
if (ViewState["List"] != null) {
List = (List<TaskDTO>)ViewState["List"];
} else {
// ArrayList isn't in view state, so we need to load it from scratch.
List = TaskList.DrawMenu(int.Parse(Session["emp"].ToString()));
}

// Code to create menu, e.g.
if (!Page.IsPosBack) {
Repeater1.DataSource = List;
Repeater1.DataBind();
}
}

void Page_PreRender(object sender, EventArgs e)
{
// Save PageArrayList before the page is rendered.
ViewState.Add("List", List);
}
...

<ul id="orderedList">
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<li><%# Eval("TaskName") %></li>
</ItemTemplate>
</asp:Repeater>
</ul>

关于c# - 如何遍历 div 以重置链接的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305777/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com