由于我无法控制的原因,我有一个包含输入和选择字段的表,这些字段使用带有runat="server"
属性的常规HTML构建(与标准ASP.NET控件相对)。我试图根据从Session传递的值(同样,我的控件之外的因素)设置在页面加载时选择的值。
设置列表项的Selected
属性不执行任何操作,也不会选择有问题的项目。我如何实现这一目标?
代码基本上就是这个(名称泛化):
HtmlSelect dropdownList = ((HtmlSelect)myTable.Rows[0].Cells[5].FindControl("DropdownList");
DataSet allListItems = this.GetDefaultListItems();
foreach (DataRow row in allListItems.Tables[0].Rows)
{
ListItem li = new ListItem(row["TextField"].ToString(), row["ValueField"].ToString());
if (li.Text == selectedListItemText)
{
li.Selected = true;
}
dropdownList.Items.Add(li);
}
Select
部分不起作用,尽管它在适当的项目上执行。是否应该在特定事件中调用此代码?我相信它是在Page_Load中调用的;应该在Pre_Render中调用吗?
编辑03/09/2011 :嗯,我不知道我是如何解决的,但它现在正在运作。所以...是的。
答案 0 :(得分:2)
尝试:
foreach (DataRow row in allListItems.Tables[0].Rows)
{
ListItem li = new ListItem(row["TextField"].ToString(), row["ValueField"].ToString());
dropdownList.Items.Add(li);
if (li.Text == selectedListItemText)
{
dropdownList.SelectedIndex = dropdownList.Items.Count-1;
}
}
修改强>
在HtmlSelect中获取SelectedIndex的来源:
get {
for (int i = 0; i < this.Items.Count; i++)
{
if (this.Items[i].Selected)
{
return i;
}
}
}
...
set {
...
if (value >= 0)
{
this.Items[value].Selected = true;
}
}
意义......它在功能上应该在任何时候为单个ListItem设置Selected属性,所以我的建议在功能上与原始相同。
所以,怀疑:数据问题,例如标记为已选择的多个项目?生命周期问题(在错误的时间创建控件?)
答案 1 :(得分:0)
这是我的工作测试代码,现在,与你的不同之处是什么?
ASPX:
<table id="myTable" runat="server">
<tr>
<td> </td><td> </td><td> </td><td> </td><td>Dropdown:</td><td><select id="DropdownList" runat="server"></select></td>
</tr>
</table>
代码隐藏:
private string selectedListItemText {
get {
if (Session("selectedListItemText") == null) {
Session("selectedListItemText") = "7. row";
}
return Session("selectedListItemText").ToString;
}
set { Session("selectedListItemText") = value; }
}
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack) {
HtmlSelect dropdownList = (HtmlSelect)myTable.Rows(0).Cells(5).FindControl("DropdownList");
DataSet allListItems = this.GetDefaultListItems();
foreach (DataRow row in allListItems.Tables[0].Rows) {
ListItem li = new ListItem(row["TextField"].ToString(), row["ValueField"].ToString());
if (li.Text == selectedListItemText) {
li.Selected = true;
}
dropdownList.Items.Add(li);
}
}
}
private DataSet GetDefaultListItems()
{
DataSet ds = new DataSet();
DataTable tbl = new DataTable();
ds.Tables.Add(tbl);
tbl.Columns.Add("ValueField");
tbl.Columns.Add("TextField");
for (Int32 i = 1; i <= 10; i++) {
DataRow row = tbl.NewRow();
row["ValueField"] = i;
row["TextField"] = i + ". row";
tbl.Rows.Add(row);
}
return ds;
}
[从VB.Net转换为C#]