Как отформатировать список или заполнение - PullRequest
0 голосов
/ 27 января 2019

enter image description here

Когда я нажимаю на мои товары в левой части формы, я получаю их по 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 + "$";
}

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Вы, вероятно, должны использовать 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);

Возможно, вас также заинтересует свойство FullRowSelect объекта ListView, которое позволяет выбрать полныйстрока, а не столбец при щелчке мыши по строке.

listView1.FullRowSelect = true;

Вывод

enter image description here

0 голосов
/ 27 января 2019

Если вы используете шрифты, которые выделяют одинаковое пространство для каждого символа, например «Новый курьер», вы можете подготовить свой объект как

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.Но я не думаю, что это стоит того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...