将一般的 ASP.NET 控件视为基于列表的控件(即 DropDownList、RadioButtonList 等)

Posted

技术标签:

【中文标题】将一般的 ASP.NET 控件视为基于列表的控件(即 DropDownList、RadioButtonList 等)【英文标题】:Treat a general ASP.NET Control like a list-based control (i.e. DropDownList, RadioButtonList, etc.) 【发布时间】:2020-04-10 06:40:01 【问题描述】:

我已经构建了一个方法,该方法使用用户指定的适当数据清除和重置 DropDownList,如下所示:

protected void ResetDDL(DropDownList ddl, DataTable dt)

    ddl.Items.Clear();
    ddl.DataSource = dt;
    ddl.DataBind();

private void LoadVehicleTypes()

    DataTable dt = new DataTable();
    SqlConnection sc = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnectionstring"].ConnectionString);
    sc.Open();
    SqlDataAdapter sda = new SqlDataAdapter("procedure", sc);
    sda.SelectCommand.CommandType = CommandType.StoredProcedure;
    sda.Fill(dt);
    sc.Close();

    ResetDDL(ddlYourDropDown, dt);

虽然这可以正常工作,但我注意到对 RadioButtonList 执行相同操作的代码是相同的,这让我想知道是否有一种方法可以将 ResetDDL 与 RadioButtonList 等效项结合起来:ResetRBL。为此,我尝试将代码中的DropDownList 替换为Control,但这只会产生Control does not contain a definition for 'Items/DataSource' 错误,因此我查看是否有任何方法可以告诉程序给定的Control 是DropDownList或 RadioButtonList 以及在确认它们是 DDL 或 RBL 后如何处理它们。这里的想法是取其中一个控件的名称,找到实际的控件本身,然后执行重置方法。

从这里,我运行了一个测试,看看我是否可以得到 Control 的类型 - 我可以!

bool itworks = false;
string tst = rbl.GetType().ToString(); // in this case, tst is "System.Web.UI.WebControls.DropDownList"
if (tst.Contains("RadioButtonList"))
    itworks = true;

从这里我认为获取控件类型就像从 GridView 中的控件中获取文本一样简单,但事实并非如此。我意识到,虽然您可以轻松获取 GridView 的文本并将其放入程序中 --

foreach (GridViewRow row in gvTempVehicleData.Rows)

    SqlCommand cmdVData = new SqlCommand("cmdVDataProcedure", sc);
    cmdVData.CommandType = CommandType.StoredProcedure;
    cmdVData.Parameters.AddWithValue("DataYear", ((TextBox)row.FindControl("txtTempDataYear")).Text);
    cmdVData.ExecuteNonQuery();

-- 对于 GridView 之外的车辆,似乎不太一样。但我仍然想知道:有没有办法将控件的名称作为字符串,找到同名的实际控件,并使用我正在寻找的控件类型的方法?如果这是可能的,我认为减少我可以使用的代码量会有所帮助。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

问题在于所采用的控件类型。该方法应该接受ListControl,而不是Control,如下所示:

public void ResetList(ListControl control, DataTable newData)

    control.Items.Clear();
    control.DataSource = newData;
    control.DataBind();

【讨论】:

以上是关于将一般的 ASP.NET 控件视为基于列表的控件(即 DropDownList、RadioButtonList 等)的主要内容,如果未能解决你的问题,请参考以下文章

使用 asp.net 控件创建无序列表?

jquery select2 与下拉列表 asp.net 服务器控件一起使用

c# asp.net,添加自定义控件

ASP.NET Web 控件下拉列表对象填充

用于 JQuery 日期时间选择器的 ASP.Net 包装器控件

使用 bootstrap v3 为 asp.net 下拉列表控件添加样式