我正在尝试编写一个可以在 C# 中填充 DropDownList 或 AJAX ComboBox(而不是使用两个单独的、几乎相同的方法)的方法。我向该方法传递查询字符串、文本字段的名称、值字段的名称以及下拉对象。这是我到目前为止所拥有的:
public static void BindDropDown(string selectCmd, string textField, string valueField, object ddList)
//Populate dropdown list (DropDownList or ComboBox)
{
// var for dropdown object
object _ddl = null;
// Get type of dropdown
if (ddList.GetType() == typeof(DropDownList))
{
_ddl = (DropDownList)ddList;
}
else if (ddList.GetType() == typeof(ComboBox))
{
_ddl = (ComboBox)ddList;
}
// Setup DB connection
SqlConnection dbConn = new SqlConnection(LTConnStr);
SqlCommand myCmd = new SqlCommand(selectCmd, dbConn);
//Set dropdown list params
_ddl.DataTextField = textField;
_ddl.DataValueField = valueField;
try
{
dbConn.Open();
_ddl.DataSource = myCmd.ExecuteReader();
_ddl.DataBind();
}
finally
{
dbConn.Close();
}
} //end method BindDropDown
但是我收到错误"'对象'不包含'数据文本字段'的定义......"。我还尝试了"is"语法:
// Get type of dropdown
if (ddList is DropDownList)
{
_ddl = (DropDownList)ddList;
}
else if (ddList is ComboBox)
{
_ddl = (ComboBox)ddList;
}
结果相同。我知道我很接近,但我不能完全弄清楚。
我会说这个"对象_ddl = null;"导致了这个问题。对象不公开 DataTextField 属性。
如果使用的是 .net 4,则可以更改:
对象 _ddl = 空;
自
动态_ddl = 空;
你的_ddl
变量是 object 类型,强制转换不会改变这一事实,所以即使你ddList
强制转换为DropDownList
或ComboBox
你也只能访问底层object
类的方法/属性。
基本上,您应该查找它们都继承的类,其中包含您需要使用的方法。这是 ListControl 类。
然后,您可以简单地使用:
ListControl _ddl = null;
代替:
object _ddl = null;
或者你可以在投射时做这样的事情:
ListControl _ddl = null;
_ddl = ddList as DropDownList;
_ddl = (_ddl == null) ? ddList as ComboBox: _ddl;
if (_ddl == null) { return; }