我每天有7个下拉列表,每天的小时数。
我没有为每个下拉列表输入datasource
,textfield
和valuefield
,而是决定创建一个小代码,它将遍历枚举并在结尾处追加星期。
但是我收到错误:Unable to cast object of type 'System.String' to type 'System.Web.UI.WebControls.DropDownList'.
行((DropDownList)strTimeFrom).DataSource = TimesAvailable();
在运行时不显示任何错误。
enum Days
{
Sunday = 1,
Monday = 2,
Tuesday = 3,
Wednesday = 4,
Thursday = 5,
Friday = 6
}
protected void Page_Load(object sender, EventArgs e)
{
foreach (Days day in Enum.GetValues(typeof(Days)))
{
object strTimeFrom = "ddlTimeFrom" + day;
object strTimeTo = "ddlTimeTo" + day;
((DropDownList)strTimeFrom).DataSource = TimesAvailable();
((DropDownList)strTimeFrom).DataTextField = "Value";
((DropDownList)strTimeFrom).DataValueField = "Key";
((DropDownList)strTimeFrom).DataBind();
}
}
protected List<KeyValuePair<int, string>> TimesAvailable()
{
List<KeyValuePair<int, string>> lstTime = new List<KeyValuePair<int, string>>();
lstTime.Add(new KeyValuePair<int, string>(-1, "--Select Time---"));
for (int intCnt = 1; intCnt <= 12; intCnt++)
{
lstTime.Add(new KeyValuePair<int, string>(intCnt, intCnt.ToString()));
}
return lstTime;
}
答案 0 :(得分:8)
strTimeFrom
是一个字符串(我假设的控件的名称),因此您不能将其转换为下拉列表。
您需要获取控件的实例,因为您知道它的名称,您可以使用FindControl。
var strTimeFrom = (DropDownList)Page.FindControl("ddlTimeFrom" + day);
答案 1 :(得分:3)
你在运行时得到它,因为你正在尝试将一个字符串转换为DropDownList。您可能会认为将strTimeFrom
声明为对象,并附加日期名称以获取您的实际DropDownList,它将起作用 - 但它不会。在一天结束时,strTimeFrom/To
是字符串,您无法将其转换为DropDownList。
在您的情况下,您应该将这些变量声明为字符串,然后尝试
var list = Page.FindControl(strTimeFrom) as DropDownList;
list.DataSource = TimesAvailable();
list.DataTextField = "Value";
list.DataValueField = "Key";
list.DataBind();
作为一项规则,您不应将变量声明为对象,特别是如果您因拳击开销而确实需要内部类型。 C#是一种强类型语言;你需要更具体。
将变量声明为对象只是为了让您的代码能够编译,这表明您需要对C#基础知识进行更多阅读。
答案 2 :(得分:2)
您无法将字符串转换为下拉列表。非常简单