如何格式化列表框或填充

时间:2019-01-27 17:16:28

标签: c# winforms listbox formatting

enter image description here

当我从表格的左侧点击我的产品时,便获得了for带价格的填充名称。 但是因为每个产品名称的名称长度都不一样,所以价格取决于丑陋的格式,所以这并不是您在我的图片左侧看到的直截了当的方式。 如果您在我的附件图片中看到,我希望它们像右侧一样。 我在“列表框格式”事件中的代码如下,但无法按我的要求进行格式化。请帮忙!

ListBox

2 个答案:

答案 0 :(得分:1)

如果使用为每个字符分配相同空间的字体,例如“ 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中绘制自定义项目。但是我认为这样做不值得。

答案 1 :(得分:1)

您可能应该使用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的视图设置为“详细信息”以显示多列

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;

输出

enter image description here