【发布时间】:2017-04-19 11:32:07
【问题描述】:
我正在尝试设置如下所示的表格:
| 姓名 | 电子邮件 | 当前用户组 | 更改用户组 |
每行的 ChangeUserGroup 列都有一个 DropDownList 控件,其中包含 3 个选项(student、advisor、admin),在 SelectedIndexChanged 事件中,每一行都会更新其用户的 userGroup。
几周前我有这个工作,但从未提交过更改,我丢失了它们并且不记得我是如何工作的。
这是我目前按表构建的方式:
-
Page_Load 调用 BuildUserTableHtml() 在表中创建 DropDownList。
private void buildUserTableHtml(List<User> users) { StringWriter htmlString = new StringWriter(); using (HtmlTextWriter writer = new HtmlTextWriter(htmlString)) { foreach(User user in users) { string name = user.firstName + " " + user.lastName; //tr writer.RenderBeginTag(HtmlTextWriterTag.Tr); //td 1 writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write(name); writer.RenderEndTag(); //td 1 end //td 2 writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write(user.email); writer.RenderEndTag(); //td 2 end //td 3 writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.Write(user.userGroup); writer.RenderEndTag(); //td 3 end //td HtmlTableCell cell = new HtmlTableCell(); DropDownList ddl = new DropDownList(); ddl.Items.Add(new ListItem("UerGroup", "0")); ddl.Items.Add(new ListItem("User", "USER")); ddl.Items.Add(new ListItem("Advisor", "ADVISOR")); ddl.Items.Add(new ListItem("Admin", "ADMIN")); ddl.SelectedIndex = 0; ddl.AutoPostBack = true; ddl.SelectedIndexChanged += userGroup_ItemChanged; cell.Controls.Add(ddl); cell.RenderControl(writer); // end td 4 //td 5 writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.AddAttribute(HtmlTextWriterAttribute.Class, "glyphicon glyphicon-remove"); writer.AddAttribute("data-toggle", "tooltop"); writer.AddAttribute(HtmlTextWriterAttribute.Title, "Delte User"); writer.AddAttribute("href", "#"); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.RenderEndTag(); writer.RenderEndTag(); writer.RenderEndTag(); //td 5 end writer.RenderEndTag(); //tr end } } userTable_PlcHldr.Controls.Add(new Literal { Text = htmlString.ToString() }); }
userTable_PlcHldr 是一个已构建的表中的 .NET 占位符,该表使用 javascript 插件使其可搜索。
<table id="userTable" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>User Group</th>
<th>Change</th>
<th>Delete User</th>
</tr>
</thead>
<tbody>
<asp:PlaceHolder ID="userTable_PlcHldr" runat="server" ></asp:PlaceHolder>
</tbody>
</table>
-
更改 DropDownList 的选定值 - 应该触发 userGroup_ItemChanged()
protected void userGroup_ItemChanged(object sender, EventArgs e) { UserGroup userGroup; DropDownList ddl = (DropDownList)sender; bool update = true; string value = ddl.SelectedValue; int ID = Int32.Parse(ddl.ID.Substring(1)); switch (value) { case "ADMIN": userGroup = UserGroup.ADMIN; break; case "ADVISOR": userGroup = UserGroup.ADVISOR; break; case "USER": userGroup = UserGroup.USER; break; default: userGroup = UserGroup.DEFUALT; update = false; break; } try { if (update) UserGroups.UpdateUserGroup(ID, userGroup); } catch (Exception ex) { string error = ex.Message; } }
但是,此代码不起作用。它正确呈现页面上的控件,但 SelectedItemChanged 永远不会触发。启用自动回发。我认为这是因为控件实际上并未正确添加到页面中,而服务器看不到它们。
还有人知道怎么做吗?
【问题讨论】:
-
我们一般不会像那样构建控制 HTML。在 ASPX 标记上声明您的控件,然后将适当的数据绑定到它。使用中继器等。
-
@mason 好的 - 我以前没有使用过中继器。如果我弄清楚与否,我会进行一些研究并报告。
-
如果您刚刚学习 ASP.NET,为什么要从 Web 窗体而不是 MVC 开始?
-
我从过去几个夏天的实习经历中了解了一些 ASP.NET,并且该公司使用 Web Forms 而不是 MVC。我正在从事的项目是一个为期一个学期的小组项目,我是唯一一个对 Web 应用程序有任何经验的人。我没有尝试同时教自己和其他 3 名学生 MVC,而是使用 WebForms,因为我熟悉它。如果有更多的时间和拥有更多知识的团队,我会使用 MVC。
-
MVC 比 Web 窗体更容易学习,它更快,更容易获得体面的架构,并且 Web 窗体不会包含在 ASP.NET 的未来中。如果还不算太晚,我强烈建议您check out MVC。只需一点 C# 和 HTML 知识,就可以轻松上手并运行。
标签: c# asp.net drop-down-menu