如何将下拉列表的DataTextField设置为显示两个数据属性字段?

20

我有一个下拉列表,需要在代码中填充数据。使用以下代码设置DataTextField属性:

ddlItems.DataTextField = "ItemName";

我想将两个数据属性显示为DataTextField。我尝试使用以下代码,但它没有起作用。我在网上做了研究,但找不到如何使用两个数据属性。

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

我需要使用什么代码来完成这个操作?

12个回答

27
您可以使用 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();

非常适合对象类型的实现或者当无法修改数据库结构时使用。 - Ghaamae

7
您可以使用ddlItems的格式事件,这将允许您设置逻辑来将特定项目转换为字符串,或者如果在您的程序中使用它有任何意义,则具有像RepresentingString这样返回Name + Desc的属性,并绑定到该属性。
具有更多答案和代码示例的类似问题: 格式化DropDownList.TextValue

我尝试使用ddlItems.DataTextFormatString = string.Format("{0}, {1}", "ItemName", "ItemDescription"),但它不会在下拉列表中显示名称和描述,它只显示"ItemName, ItemDescription"。 - Theomax
string.Format(...) 的结果本身就是这样,所以那样做没有意义。我建议监听将项转换为文本以进行显示的事件,从而允许您在其中设置逻辑。 - SimpleVar
我不明白为什么这个简单的任务不能在ASP代码中使用<%$ %>语法优雅地实现?为什么ASP不允许这样做?有点令人失望。或者也许有一种方法,我们还没有想到? - ovi

4

我曾以两种方式类似地完成过这个任务:一种是用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#? - Teepeemm
已经有一段时间了(我在这里回复消息遇到了问题,可能是我的错),但我相信可以用任何一种方式来完成。 - Davezilla

3

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

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

希望对您有所帮助。


1
希望这个能够工作,但是它只是抛出了一个错误:"DataBinding: 'System.Data.DataRowView' 不包含名称为 '<value of combined fields>' 的属性。" - JuSTMOnIcAjUSTmONiCAJusTMoNICa
在后台代码中执行 <%# Eval("Id")+" - "+Eval("Title") %> 吗? - Kiquenet

1

格式化DropDownList.TextValue的评论中,我了解到了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();

1
只需在后台代码中填写下拉列表即可。
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()

1

我以前曾经做过这个,但是使用的是 Telerik RadComboBox(它能够包含一个项模板)。模板只是一个 HTML 表格,我似乎“连接”了两个字段。我相信标准的 ASP.NET 控件没有这个功能,但是如果你找一下,你会发现有第三方控件可以实现。

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

我相信还有其他方法可以实现这个目标(无疑更有效率的方法),这些只是我知道的一些方法,希望对你有所帮助。


0
以下代码对我有效:
select id, ItemName + ' - ' + ItemDescription as 'yournamecolumn' from `yourtable`
ddlItems.DataTextField = "yournamecolumn";
ddlItems.DataValueField = "id";
ddlItems.DataBind();

0
在C#中,我们可以通过创建一个属性来将多个列绑定到数据文本字段,该属性是所有必需列的串联,例如全名。
public string FullName
{
            get
            {
                return  RollNo + Name +  Parentage;
            }
}

创建FullName属性后,使用datatextfeild="FullName"


0
objDT.Columns.Add("FullName", GetType(String), "time + ' ' + location")
                        objDT.AcceptChanges()
                        ddlPickUp.DataSource = objDT
                        ddlPickUp.DataTextField = "FullName"
                        ddlPickUp.DataValueField = "location"
                        ddlPickUp.DataBind()

尽管这段代码可能可以解决问题,但是包括解释如何以及为什么能够解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞同。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Kevin M. Mansour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接