【问题标题】:How to assign Datatypes for the DropDownList bounded with List of Items如何为与项目列表绑定的 DropDownList 分配数据类型
【发布时间】:2014-06-18 19:25:45
【问题描述】:

我有一个 DropDownList 与 SqlDatasource 中的项目列表绑定。 DropDownList 中的项目列表基于以下查询有界

从 INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME) 中选择 COLUMN_NAMES = '结果')

我的要求:如何为那些 DropDownList 项目分配多个数据类型,即项目列表中的少数索引应分组为十进制数据类型,少数索引应分组为 Varchar ,日期时间数据类型。

我想根据 DDL 输入的数据类型和相应的 DropDownList_SelectedIndexChanged() 生成动态 Web 控件。 我的 SQL 查询:

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='RESULT' group by DATA_TYPE,COLUMN_NAME

输出:

COLUMN_NAME  DATA_TYPE  

a            decimal
b            decimal
c            decimal
d            int
e            int
f            varchar
g            varchar
h            varchar
i            varchar
j            varchar

如果从 DDL 中选择 a、b 或 c,我需要为 Decimal 数据类型 SelectedIndexValue 生成唯一的动态 Web 控件。

如何进行?

我的aspx代码:

<asp:Panel ID="Panel5" runat="server" Height="221px">
        <span style="font-size: 135%; font-family: Verdana; font-weight: bold"> Search Functionalities </span>
        <asp:DropDownList ID="DropDownList5" runat="server" DataSourceID="column_list_for_filter" DataTextField="All_Columns" DataValueField="All_Columns" OnSelectedIndexChanged ="DropDownList5_SelectedIndexChanged"  AutoPostBack="true">
        </asp:DropDownList>
        <asp:SqlDataSource ID="column_list_for_filter" runat="server" ConnectionString="<%$ ConnectionStrings:DatabaseConnectionString %>" SelectCommand="SELECT COLUMN_NAME 'All_Columns' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='RESULT'  "></asp:SqlDataSource>
        <asp:Button ID="Button1" runat="server" Font-Bold="True" Font-Names="Arial" Font-Size="Small" OnClick="Button1_Click" Text="Search Flow Periods" Width="144px" />
        <asp:Table ID="dynamic_filter_table" runat="server" ToolTip="Results">
        </asp:Table>
</asp:Panel>

C#代码:

  protected void DropDownList5_SelectedIndexChanged(object sender, EventArgs e)
     {
         if(DropDownList5.SelectedIndex.Equals(typeof(Decimal)))
         {
            createdynamiccontrols();
         }
         else if (DropDownList5.SelectedIndex.Equals(typeof(DateTime)))
         {
             //Create Unique Web Controls
         }

         else if (DropDownList5.SelectedIndex.Equals(typeof(Char)))
         {
             //Create Unique Web Controls
         }
     }

【问题讨论】:

  • 恕我直言,您需要像这样连接 2 列 - SELECT COLUMN_NAME + ' - ' + DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Result' 然后将其绑定到您的下拉列表。然后在 SelectedIndexChanged 事件中,您需要使用 substring 函数。如果您有任何困惑,请告诉我...
  • @KrishnrajRana 你能帮忙解决这个问题吗stackoverflow.com/questions/23535042/…

标签: c# asp.net sql-server servercontrols


【解决方案1】:

正确的解决方案:

如果"e"从以下DropDownList输入中选择,则DropDownList中保留的值为"e"

COLUMN_NAME  DATA_TYPE  
a            decimal
b            decimal
c            decimal
d            int
e            int
f            varchar
g            varchar  
h            varchar
i            varchar
j            varchar

来源:DropDownList with repeated data value fields OnSelected get confused and chooses the first one why?

aspx代码:

<asp:DropDownList ID="DropDownList5" runat="server"  AutoPostBack="true" OnSelectedIndexChanged ="DropDownList5_SelectedIndexChanged" DataSourceID="column_list_for_filter">
</asp:DropDownList>                           

<asp:SqlDataSource ID="column_list_for_filter" runat="server">
</asp:SqlDataSource>

C#代码:

protected void Page_Load(object sender, EventArgs e)
    {      
        if (!IsPostBack)
        {
            BindDropDownLists();
        }

        else
        {
            if (!String.IsNullOrEmpty(DropDownList5.SelectedValue))
            {
                if (DropDownList5.SelectedValue.Contains("decimal"))
                {
                    createdynamiccontrols_decimal();
                }

                else if (DropDownList5.SelectedValue.Contains("varchar"))
                {
                    createdynamiccontrols_varchar();
                }
                else if (DropDownList5.SelectedValue.Contains("datetime"))
                {
                    create_cntrls();
                }

                else if (DropDownList5.SelectedValue.Contains("int"))
                {
                    Create();
                }


            }

        }
    }

private void BindDropDownLists()
     {
         column_list_for_filter.ConnectionString = connection;
         column_list_for_filter.SelectCommand = "SELECT DATA_TYPE + '_' + convert(varchar(10), ROW_NUMBER() OVER(ORDER BY DATA_TYPE))as DATA_TYPE, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME = 'RESULT' AND COLUMN_NAME IN ('a','b','c','d','e','f','g','h','i'))";
         DropDownList5.DataTextField = "COLUMN_NAME";
         DropDownList5.DataValueField = "DATA_TYPE";
         DropDownList5.DataBind();

     }

【讨论】:

    【解决方案2】:

    Equals 方法将进行对象级别的比较。这意味着它将检查两个对象是否相同。在您的情况下,DropDownList5.SelectedIndex 将给出int 对象,您将其与typeof 其他对象进行比较,除非typeofint,否则它将始终返回false。

    由于您得到的结果是列名为COLUMN_NAMEDATA_TYPE,因此请更改您的DropDownList 标记以包含这些列名。作为,

    <asp:DropDownList ID="DropDownList5" runat="server" DataSourceID="column_list_for_filter" DataTextField="COLUMN_NAME" DataValueField="DATA_TYPE" OnSelectedIndexChanged ="DropDownList5_SelectedIndexChanged"  AutoPostBack="true">
            </asp:DropDownList>
    

    然后你会得到DropDownList5.SelectedValue中列的DataType,也就是string。然后,您可以通过将SelectedValueDataTypestring 名称进行比较,根据DropDownList 选择添加控件。作为,

    protected void DropDownList5_SelectedIndexChanged(object sender, EventArgs e)
    {
        if(DropDownList5.SelectedValue == "decimal")
        {
            TextBox1.Text = dr.GetString(0);
        }
        else if(DropDownList5.SelectedValue == "int")
        { 
            Label1.Text = dr.GetString(0);
        }
        else if(DropDownList5.SelectedValue == "varchar")
        {
            Button1.Text = dr.GetString(0);
        }
    }
    

    【讨论】:

    • @Bharadwaj 非常感谢!!!我能够为 DDL 中的 Decimal 数据类型的选定值创建动态 Web 控件。你让我开心!!
    • @ Bharadwaj : stackoverflow.com/questions/23419467/… 你也可以帮忙吗?
    【解决方案3】:

    我以这种方式假设您的方案,您需要根据数据类型对 column_name 值进行分类,一旦分类,所选值应该显示在唯一的 Web 控件中,对吗?如果是这样,请尝试在 dropdwon selectchange 事件中使用这行代码。

    SqlConnection con=new Sqlconnenction("Your Connection String");
    con.Open();
    Sqlcommand cmd = new SqlCommand("Select * from your database",con); // Your two columns
    SqlDateReader dr=cmd.ExecuteReader();
    while(dr.Read())
    {
      if(dr.GetString(1) == "decimal") // dr.GetString(1) = 'Your Second Column'
      {
        TextBox1.Text = dr.GetString(0);
      }
      else if(dr.GetString(1)=="int")
      {
        Label1.Text = dr.GetString(0);
      }
      else if(dr.GetString(1)=="varchar")
      {
        Button1.Text = dr.GetString(0);
      }
    }
    con.Close();
    

    如果我让你感到困惑,请告诉我。

    【讨论】:

    • 我的 DDL 项目列表已经与列名绑定,即仅来自 SqlDataSource 的架构信息。在数据库方面,我们在创建表时分配数据类型。对于 DDL 项目列表,如果选择了某个索引,则必须检查十进制或 int 或 varchar,然后必须创建新的文本框或标签 Web 控件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多