【问题标题】:How to set drop down list DataTextField to display two data property fields?如何设置下拉列表 DataTextField 以显示两个数据属性字段?
【发布时间】:2012-03-23 10:45:22
【问题描述】:

我有一个下拉列表,其中填充了后面代码中的数据。 DataTextField 属性设置如下代码:

ddlItems.DataTextField = "ItemName";

我想将两个数据属性显示为DataTextField。我尝试使用以下代码,但没有成功。而且我在网上研究过,但找不到如何使用两个数据属性。

ddlItems.DataTextField = "ItemName" + "ItemDescription";

我需要使用什么代码来执行此操作?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    我以两种方式完成了类似的操作:在 C# 或 SQL 中。

    下面的 Matteo Gaggiano 给出了 C# 方法的一个很好的例子:

    dataTable.Columns.Add(new DataColumn("Title", System.Type.GetType("System.String"), "ItemName + ' - ' + ItemDescription"));
    
    ddlItems.DataSource = dataTable;
    ddlItems.DataTextField = "Title";
    ddlItems.DataValueField = "Id";
    ddlItems.DataBind();
    

    也可以用SQL来完成:

    SELECT ItemName + ' - ' + ItemDescription AS Title FROM yourSQLtable
    

    然后在 C# 代码中使用上面的最后四行。

    【讨论】:

    • 所以您对 C# 问题的回答的新部分是您可以使用 SQL 代替 C#?
    • 已经有一段时间了(我在这里回复消息时遇到了问题,这可能是我的错),但我相信我说的是两种方法都可以。
    【解决方案2】:

    您可以使用 LinqToSql 创建一个新的数据源,其中包含一个按您希望的方式格式化的显示字段,例如:

    var datasource = from x in products
                     select new {
                         x.Id,
                         x.Code,
                         x.Description,
                         DisplayField = String.Format("{0} ({1})", x.Code, x.Description)
                     };
    
    comboBox.DataSource = datasource;
    comboBox.DataValueField = "Id";
    comboBox.DataTextField = "DisplayField";
    comboBox.DataBind();
    

    【讨论】:

    • 非常适合对象类型的实现或无法修改数据库结构时。
    【解决方案3】:

    您可以使用 ddlItems 的 Formatting 事件,这将允许您设置逻辑以如何将某个项目转换为字符串,或者如果在您的程序中使用它有任何意义,则具有像 RepresentingString 这样的属性,它返回 Name + Desc,并绑定到该属性。

    具有更多答案和代码示例的类似问题: Format DropDownList.TextValue

    【讨论】:

    • 我尝试使用 ddlItems.DataTextFormatString = string.Format("{0}, {1}", "ItemName", "ItemDescription") 但它没有在下拉列表中显示名称和描述下拉列表,它只显示“ItemName, ItemDescription”。
    • string.Format(...) 本身的结果就是这样,所以这毫无意义。我建议收听将项目转换为文本以显示的事件,允许您将逻辑设置为该事件。
    • 我不明白为什么这个简单的任务不能在带有 语法的asp代码中优雅地完成?为什么asp不允许这样做?有点令人失望。或者也许有一种方法,我们还没有弄清楚?
    【解决方案4】:

    只需从后面的代码中填写下拉列表

    HTML

    <asp:DropDownList ID="ddlSample" runat="server"></asp:DropDownList>
    

    VB.NET

            Dim Conn As SqlConnection
            Dim Comm As SqlCommand
            Dim Read As SqlDataReader
    
            Conn = New SqlConnection()
            Conn.ConnectionString = ConfigurationManager.ConnectionStrings("Read").ConnectionString
    
            Comm = New SqlCommand()
            Comm.CommandType = CommandType.Text
            Comm.CommandText = "SELECT * FROM TABLE"
            Comm.Connection = Conn
            Comm.Connection.Open()
    
            Read = Comm.ExecuteReader()
            ddlSample.Items.Insert(0, New ListItem("Seleziona", ""))
            While Read.Read()
                ddlSample.Items.Insert(1, New ListItem(Read("ID") & " - " & Read("Desc")), ReadLivelli("ID")))
            End While
    
            Read.Close()
            Comm.Connection.Close()
            Comm.Dispose()
            Conn.Dispose()
    

    【讨论】:

      【解决方案5】:

      Format DropDownList.TextValue 的评论开始,我了解了 DataColumn.Expression(DataColumn.Expression Property 所以这可能是一个有效的解决方案(在我的情况下它是完美的):

      DataColumn title = new DataColumn();
      title.ColumnName = "Title";
      title.DataType = System.Type.GetType("System.String");
      title.Expression = "ItemName + ' - ' + ItemDescription";
      dataTable.Columns.Add(title);
      
      // Or in one line
      
      dataTable.Columns.Add(new DataColumn("Title", System.Type.GetType("System.String"), "ItemName + ' - ' + ItemDescription"));
      
      ddlItems.DataSource = dataTable;
      ddlItems.DataTextField = "Title";
      ddlItems.DataValueField = "Id";
      ddlItems.DataBind();
      

      【讨论】:

        【解决方案6】:

        最简单的方法是在 .aspx 文件中:

        <asp:DropDownList ID="ddlItems" runat="server" DataSourceID="YourDataSource" DataTextField='<%# Eval("Id")+" - "+Eval("Title") %>' ..... />
        

        希望有用。

        【讨论】:

        • 如果这样会很好,但它只会引发错误:“DataBinding: 'System.Data.DataRowView' 不包含名为 '' 的属性”。
        • 在代码后面做&lt;%# Eval("Id")+" - "+Eval("Title") %&gt;
        【解决方案7】:

        我之前已经实现了这一点,但我是使用telerik radcombobox(它能够包含一个项目模板)来实现的。该模板只是一个 html 表,我似乎“连接”了这两个字段。我很确定标准的 asp .net 控件没有此功能 - 但如果您环顾四周,您会发现一个 3rd 方控件。

        当然可以在业务层处理这种串联,并定义一个新类型(结构可能是最好的),其属性包含两个字段作为一个字符串。

        我确信还有其他方法可以实现这一点(毫无疑问更有效的方法),这些只是我知道的一些可能会有所帮助的方法。

        【讨论】:

          【解决方案8】:

          如果您使用实体框架代码优先进行编码,您可以创建一个名为NameAndDescription 的新字段并设置您的ddlItems.DataTextField = "NameAndDescription"。该字段可以按如下方式创建:

              public String NameAndDescription
              {
                  get { return this.ItemName + this.ItemDescription; }
              }
          

          【讨论】:

            【解决方案9】:

            试试这个:

            select std.Student_ID,std.Student_Name+' - '+ std.Admission_ID Student_Name 
            from Student_tbl std , School_tbl sch 
            where sch.School_ID = '" + School_ID + "' and std.Current_Class = '" + Class_ID + "' 
                  and std.Section_ID = '" + Section_ID + "'
            
            DL_Student.DataTextField = "Student_Name";
            DL_Student.DataValueField = "Student_ID";
            

            【讨论】:

              【解决方案10】:

              以下代码对我有用:

              select id, ItemName + ' - ' + ItemDescription as 'yournamecolumn' from `yourtable`
              ddlItems.DataTextField = "yournamecolumn";
              ddlItems.DataValueField = "id";
              ddlItems.DataBind();
              

              【讨论】:

                【解决方案11】:
                objDT.Columns.Add("FullName", GetType(String), "time + ' ' + location")
                                        objDT.AcceptChanges()
                                        ddlPickUp.DataSource = objDT
                                        ddlPickUp.DataTextField = "FullName"
                                        ddlPickUp.DataValueField = "location"
                                        ddlPickUp.DataBind()
                

                【讨论】:

                • 虽然这段代码可能会解决问题,包括解释如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。
                猜你喜欢
                • 1970-01-01
                • 2010-09-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多