如何格式化列表框或填充
How to Format Listbox or padding
当我从表格左侧单击我的产品时,我会在 ListBox
填充名称和价格上找到它们。
但是因为每个产品名称的名称长度都不同,所以价格在于丑陋的格式,所以它不是您在我的图像左侧看到的直接方式。
如果您在我的附加图片上看到,我希望它们像在右侧一样。
我在列表框格式事件中的代码如下,但无法按照我的意愿进行格式化。请帮忙!
private void ListOfPaidProducts_Format(object sender, ListControlConvertEventArgs e)
{
string currentProductName = ((Product)e.ListItem).Description;
string currentPrice = String.Format("{0}", ((Product)e.ListItem).Price); // I tried even with {0,20}....
string currentProductNamePadded = currentProductName.PadRight(30);
e.Value = currentProductNamePadded + currentPrice + "$";
}
如果您使用为每个字符分配相同 space 的字体,例如 "Courier New",您可以准备对象
public class DisplayProduct // create a little decorator
{
public DisplayProduct(Product prod, int pad)
{
Display = prod.Name.PadRight(pad) + prod.Price;
}
private Product Prod {get; set;}
// if you plan to use Product properties, you can change scope and do
// ((ProductDisplay)list.SelectedItem).Prod.Price
public int Id {get{return Prod.Id;}}
public string Name {get{return Prod.Name;}}
public string Display {get; private set;}
}
List<Product> products = GetList(...);
int maxLen = products.Max(p => p.Name.Length) + 5;
var diplayList = products.Select(p => new DisplayProduct(p, maxLen));
myListBox.DisplayMember = "Display";
myListBox.ValueMember = "Id";
myListBox.DataSource = diplayList;
但是您可以使用网格甚至 ListView
来显示结构数据。您可以做的另一件事 - 在 ListBox
中绘制自定义项目。但我认为这不值得练习。
您可能应该使用 ListView 而不是 ListBox。
例如,对于数据
List<Product> list = new List<Product>
{
new Product{Description = "abc efg", Price= 123},
new Product{Description = "abc efg hijk 12 1212 12", Price= 23},
new Product{Description = "abc", Price= 343},
new Product{Description = "abc efg", Price= 22}
};
您可以按如下方式配置 ListView。
将 ListView 的视图设置为 Detail 以显示多列
listView1.View = View.Details;
下一步添加两列,用于显示描述和价格。
listView1.Columns.Add("Description");
listView1.Columns.Add("Price");
现在您可以按如下方式将项目添加到 ListView。
foreach(var items in list)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = items.Description;
lvi.SubItems.Add($"{items.Price} $");
listView1.Items.Add(lvi);
}
最后,您可以使用 AutoReizeColumn 方法确保列自行调整到最大内容大小。
listView1.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent);
listView1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
您可能还对 ListView 的 FullRowSelect 属性 感兴趣,它可以选择整行,而不是鼠标单击行时的列。
listView1.FullRowSelect = true;
输出
当我从表格左侧单击我的产品时,我会在 ListBox
填充名称和价格上找到它们。
但是因为每个产品名称的名称长度都不同,所以价格在于丑陋的格式,所以它不是您在我的图像左侧看到的直接方式。
如果您在我的附加图片上看到,我希望它们像在右侧一样。
我在列表框格式事件中的代码如下,但无法按照我的意愿进行格式化。请帮忙!
private void ListOfPaidProducts_Format(object sender, ListControlConvertEventArgs e)
{
string currentProductName = ((Product)e.ListItem).Description;
string currentPrice = String.Format("{0}", ((Product)e.ListItem).Price); // I tried even with {0,20}....
string currentProductNamePadded = currentProductName.PadRight(30);
e.Value = currentProductNamePadded + currentPrice + "$";
}
如果您使用为每个字符分配相同 space 的字体,例如 "Courier New",您可以准备对象
public class DisplayProduct // create a little decorator
{
public DisplayProduct(Product prod, int pad)
{
Display = prod.Name.PadRight(pad) + prod.Price;
}
private Product Prod {get; set;}
// if you plan to use Product properties, you can change scope and do
// ((ProductDisplay)list.SelectedItem).Prod.Price
public int Id {get{return Prod.Id;}}
public string Name {get{return Prod.Name;}}
public string Display {get; private set;}
}
List<Product> products = GetList(...);
int maxLen = products.Max(p => p.Name.Length) + 5;
var diplayList = products.Select(p => new DisplayProduct(p, maxLen));
myListBox.DisplayMember = "Display";
myListBox.ValueMember = "Id";
myListBox.DataSource = diplayList;
但是您可以使用网格甚至 ListView
来显示结构数据。您可以做的另一件事 - 在 ListBox
中绘制自定义项目。但我认为这不值得练习。
您可能应该使用 ListView 而不是 ListBox。
例如,对于数据
List<Product> list = new List<Product>
{
new Product{Description = "abc efg", Price= 123},
new Product{Description = "abc efg hijk 12 1212 12", Price= 23},
new Product{Description = "abc", Price= 343},
new Product{Description = "abc efg", Price= 22}
};
您可以按如下方式配置 ListView。
将 ListView 的视图设置为 Detail 以显示多列
listView1.View = View.Details;
下一步添加两列,用于显示描述和价格。
listView1.Columns.Add("Description");
listView1.Columns.Add("Price");
现在您可以按如下方式将项目添加到 ListView。
foreach(var items in list)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = items.Description;
lvi.SubItems.Add($"{items.Price} $");
listView1.Items.Add(lvi);
}
最后,您可以使用 AutoReizeColumn 方法确保列自行调整到最大内容大小。
listView1.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent);
listView1.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
您可能还对 ListView 的 FullRowSelect 属性 感兴趣,它可以选择整行,而不是鼠标单击行时的列。
listView1.FullRowSelect = true;
输出