我有以下代码:
DataRow CreateRow(DataTable dt, string name, string country)
{
DataRow dr = dt.NewRow();
dr["Name"] = name;
dr["Country"] = country;
return dr;
}
protected void Page_Load(object sender, EventArgs e)
{
// creating the data table
DataTable dt = new DataTable("Student Details");
// adding two columns Name and Country
dt.Columns.Add("Name", typeof(String));
dt.Columns.Add("Country", typeof(String));
// create 3 rows
dt.Rows.Add(CreateRow(dt, "Varun", "India"));
dt.Rows.Add(CreateRow(dt, "Li", "China"));
dt.Rows.Add(CreateRow(dt, "Yishan", "China"));
// create a data view
DataView dv = new DataView(dt);
DropDownList1.DataSource = dv;
DropDownList1.DataTextField = "Name";
DropDownList1.DataValueField = "Country";
DropDownList1.DataBind();
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
int x = DropDownList1.SelectedIndex;
int temp = 0;
temp++;
}
并且标记看起来像这样:
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"></asp:Label>
<br />
<br />
<asp:DropDownList ID="DropDownList1" runat="server"
onselectedindexchanged="DropDownList1_SelectedIndexChanged"
AutoPostBack="true">
</asp:DropDownList>
</div>
</form>
</body>
问题是无论我选择什么,标签总是显示Varun。我调试了代码,发现“DropDownList1.SelectedIndex”总是因某种原因返回0。
我不确定为什么会这样。每次从下拉列表中选择一些东西时,都会调用函数“DropDownList1_SelectedIndexChanged”。
由于
答案 0 :(得分:6)
看起来你绑定了Page_Load ...
中的下拉列表请记住,当下拉列表发生更改时,它会回发(AutoPostBack ='True'),并且由于您在Page_Load上绑定,它只会重新绑定索引更改的时间...而不是您想要的!
你应该这样做:
if (!IsPostBack)
{
BindDropDownList1();
}
答案 1 :(得分:1)
确保启用了ViewState(对于更改事件),并将OnLoad
中的代码移至OnInit
。这将阻止ViewState在Init之后和Load之前被覆盖。
可选地,您还应该将初始化代码包装在IsPostback
检查中,以避免在每次请求时加载数据。
答案 2 :(得分:1)
您可以使用此代码:
foreach (ListItem item in DropDownList1.Items)
{
if (item.Text == defaultText)
{
item.Selected = true;
break;
}
}
答案 3 :(得分:1)
您可以尝试覆盖页面的OnPreRender
方法:
protected override OnPreRender(EventArgs e)
{
DropDownList1.SelectedIndex = Convert.ToInt32(ViewState["PageIndex"]);
base.OnPreRender(e);
}
另外,请确保EnableViewState
设置为True
。