我正在尝试在C#中设置.DisplayMember
的{{1}}属性,但是我想将其绑定到ComboBox
中的多个列。
我的SQL看起来像这样:
.DataSouce
我将此查询保存在SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName
FROM Pers WHERE PersNbr = :persNbr;
中,因此所选的每一列在DataTable
中都有自己的列。
我想将Datatable
组合成.DisplayMember
,以便其全名显示如下:
PersFirstName + PersMiddleName + PersLastName
我知道我可以在查询中做到这一点
comboBox.DisplayMemeber = "PersFirstName" + "PersMiddleName" + "PersLastName"
然后执行以下操作:
SELECT PersNbr, (PersFirstName || PersMiddleName || PersLastName) PersName
但是我不想对数据库层中的数据进行格式化,因为它不应该在那里存在。
我还能如何在Winforms中实现这一目标?
答案 0 :(得分:5)
您可以创建一个expression column,然后将其用作DisplayMember:
dataTable.Columns.Add(
"FullName",
typeof(string),
"PersFirstName + ' ' + PersMiddleName + ' ' PersLastName");
comboBox.DisplayMember = "FullName";
答案 1 :(得分:1)
如果使用数据表,则应在数据库层上执行此过程。我建议您通过使用POCO类来做到这一点。但是,如果您真的想在应用程序层上使用数据表来执行此操作,则以下代码:
dataTable.Columns.Add("PersName");
foreach(DataRow item in dataTable.Rows)
{
item["PersName"] = item["PersFirstName"] + item["PersMiddleName"] + ["PersLastName"]
}
然后,您可以将DisplayMember属性设置为“ PersName”。
答案 2 :(得分:0)
不要仅使用繁重的DataTable
来将数据从数据库传输到代码。创建一个类,在其中加载数据,然后您将能够在完全支持所用编程语言(功能等)的情况下格式化数据
public class Person
{
public int Number { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string Name => $"{FirstName} {MiddleName} {LastName}";
}
// Load data
var persons = new List<Person>();
using (var connection = new SqlConnection(connectionsString))
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName FROM Pers";
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var person = new Person
{
Number = reader.GetInt32(0),
FirstName = reader.GetString(1),
MiddleName = reader.GetString(2),
LastName = reader.GetString(3),
};
persons.Add(person);
}
}
}
combobox.DisplayMember = "Name";
combobox.DataSource = persons;