我希望我的下拉列表显示第一个值:“ - select car - ”
我以这种方式取得成功:
protected void ddl1_DataBound(object sender, EventArgs e)
{
Convert.ToInt32(ddl1.SelectedValue);
ddl1.Items.Insert(0, new ListItem("-Choose car-", "-Choose car-" ));
}
并且没关系,“-choose-”是第一位的,但现在的问题是,如果我有值,例如,下拉列表显示如下:
-Choose car-
Subaro
Fiat
Honda
当我进入网站时显示的第一个值是Subaro,并且要查看-choose car-用户需要打开下拉列表,然后他会在第一个位置看到-choose car-。我怎么能从一开始就做这个,从页面加载 - -choose car-将在页面加载的ddl上显示。我在代码中出错了吗?
我用AppendDataBoundItems = "true"
尝试了项目列表,但是我收到了错误,当我成功时,问题就像我之前说过的那样。
答案 0 :(得分:4)
使用AppendDataBoundItems
属性时,您处于正确的轨道上,如果您要对列表进行数据绑定,则应将其设置为true
。
您的标记应如下所示
<asp:DropDownList runat="server" ID="ddl1" AppendDataBoundItems="true">
<asp:ListItem Text="-Choose car-" />
</asp:DropDownList>
你的代码可能看起来像这样
ddl1.DataSource = [your datasource goes here];
ddl1.DataBind();
这会将选择汽车文字作为下拉列表中的第一个选项,并在其下方附加其余选项。
现在,对于为什么更有趣的部分,您看到了您所看到的行为(第一项未被选中)。如果您使用SelectedIndex
之类的工具(不属于Telerik,只是碰巧使用他们的工具)来查看JustDecompile的实现,您会看到如下所示的代码:
public int SelectedIndex
{
get
{
int num = 0;
num++;
while (num < this.Items.Count)
{
if (this.Items[num].Selected)
{
return num;
}
}
return -1;
}
set
{
// stuff you don't care about
this.ClearSelection();
if (value >= 0)
{
this.Items[value].Selected = true;
}
// more stuff you don't care about
}
}
正如您所看到的,索引不会存储在任何位置,而是每次根据哪个项将Selected
属性设置为true来计算。当您在标记中将SelectedIndex
设置为0并对数据源进行数据绑定时,它将在您的案例Subaro
中选择该列表中的第0个项目。当您在列表的开头插入新项目时,Subaro
仍然会被标记为所选项目,这就是为什么在页面加载时,您会看到选中而不是Choose car
。如果您想使用代码将Choose car
标记为所选项目,则必须在数据下达数据后对其进行操作。 请注意,这只是DropdownList
工作原理的实施细节。它可能会在未来的ASP.NET版本中发生变化,因此不要以这种方式编写依赖于它的代码。
答案 1 :(得分:2)
确保当您插入第一个项目“-Choose car-”时,不要在每个PostBack上进行一次。检查是否IsPostBack
添加第1项。
编辑:
例如:
protected void Page_Load(object sender,EventArgs e) { 如果(!的IsPostBack) { ddl1.Items.Insert(0,new ListItem(“ - 选择car-”,“ - 选择car-”)); }
ddl1.SelectedIndex = 0;
}
答案 2 :(得分:1)
您应首先ddl1.Items.Insert(0, new ListItem("-Choose car-", "-Choose car-"));
,而不是ddl1.SelectedIndex = 0
答案 3 :(得分:0)
private void FillCar()
{
DataTable dt = GetCar();
ddl1.Items.Clear();
ddl1.DataSource = dt;
ddl1.DataTextField = "carName"; // field name in the database
ddl1.DataValueField = "CarNum"; // field name in the database
ddl1.DataBind();
ListItem li = new ListItem();
li.Text = "--Choose car--";
li.Value = "-1";
ddl1.Items.Insert(0, li);
ddl1.SelectedIndex = 0;
}
我使用这样的方法并在if (!IsPostBack){}
中的页面加载中调用它。