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