如何将字符串转换为Dropdownlist?

时间:2013-12-24 00:10:33

标签: c#

我每天有7个下拉列表,每天的小时数。

我没有为每个下拉列表输入datasourcetextfieldvaluefield,而是决定创建一个小代码,它将遍历枚举并在结尾处追加星期。

但是我收到错误: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;
}

3 个答案:

答案 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)

您无法将字符串转换为下拉列表。非常简单