如何格式化列表框或填充

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;

输出