Как изменить размер listbox

In Windows Forms ListBox control is used to show multiple elements in a list from which a user can select one or more elements and the elements are generally displayed in multiple columns. In ListBox you are allowed to set the height and width of the ListBox in pixels using

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In Windows Forms, ListBox control is used to show multiple elements in a list, from which a user can select one or more elements and the elements are generally displayed in multiple columns. In ListBox, you are allowed to set the height and width of the ListBox in pixels using Size Property of the ListBox which makes your ListBox more attractive. You can set this property in two different ways:

    1. Design-Time: It is the easiest way to set the size of the ListBox as shown in the following steps:

    • Step 1: Create a windows form as shown in the below image:
      Visual Studio -> File -> New -> Project -> WindowsFormApp
    • Step 2: Drag the ListBox control from the ToolBox and drop it on the windows form. You are allowed to place a ListBox control anywhere on the windows form according to your need.
    • Step 3: After drag and drop you will go to the properties of the ListBox control to set the size of the ListBox.

      Output:

    2. RunTime: It is a little bit trickier than the above method. In this method, you can set the size of the ListBox control programmatically with the help of given syntax:

    public System.Drawing.Size Size { get; set; }

    Here, Size indicates the height and width of the ListBox in pixels. The following steps show how to set the size of the ListBox dynamically:

    • Step 1: Create a list box using the ListBox() constructor is provided by the ListBox class.
      // Creating ListBox using ListBox class constructor
      ListBox mylist = new ListBox();
      
    • Step 2: After creating ListBox, set the Size property of the ListBox provided by the ListBox class.
      // Setting the size of the ListBox
       mylist.Size = new Size(120, 95);
      
    • Step 3: And last add this ListBox control to the form using Add() method.
      // Add this ListBox to the form
      this.Controls.Add(mylist);
      

      Example:

      using System;

      using System.Collections.Generic;

      using System.ComponentModel;

      using System.Data;

      using System.Drawing;

      using System.Linq;

      using System.Text;

      using System.Threading.Tasks;

      using System.Windows.Forms;

      namespace WindowsFormsApp25 {

      public partial class Form1 : Form {

          public Form1()

          {

              InitializeComponent();

          }

          private void Form1_Load(object sender, EventArgs e)

          {

              ListBox mylist = new ListBox();

              mylist.Location = new Point(287, 109);

              mylist.Size = new Size(120, 95);

              mylist.ForeColor = Color.Purple;

              mylist.Items.Add(123);

              mylist.Items.Add(456);

              mylist.Items.Add(789);

              this.Controls.Add(mylist);

          }

      }

      }

      Output:

    Improve Article

    Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    In Windows Forms, ListBox control is used to show multiple elements in a list, from which a user can select one or more elements and the elements are generally displayed in multiple columns. In ListBox, you are allowed to set the height and width of the ListBox in pixels using Size Property of the ListBox which makes your ListBox more attractive. You can set this property in two different ways:

    1. Design-Time: It is the easiest way to set the size of the ListBox as shown in the following steps:

    • Step 1: Create a windows form as shown in the below image:
      Visual Studio -> File -> New -> Project -> WindowsFormApp
    • Step 2: Drag the ListBox control from the ToolBox and drop it on the windows form. You are allowed to place a ListBox control anywhere on the windows form according to your need.
    • Step 3: After drag and drop you will go to the properties of the ListBox control to set the size of the ListBox.

      Output:

    2. RunTime: It is a little bit trickier than the above method. In this method, you can set the size of the ListBox control programmatically with the help of given syntax:

    public System.Drawing.Size Size { get; set; }

    Here, Size indicates the height and width of the ListBox in pixels. The following steps show how to set the size of the ListBox dynamically:

    • Step 1: Create a list box using the ListBox() constructor is provided by the ListBox class.
      // Creating ListBox using ListBox class constructor
      ListBox mylist = new ListBox();
      
    • Step 2: After creating ListBox, set the Size property of the ListBox provided by the ListBox class.
      // Setting the size of the ListBox
       mylist.Size = new Size(120, 95);
      
    • Step 3: And last add this ListBox control to the form using Add() method.
      // Add this ListBox to the form
      this.Controls.Add(mylist);
      

      Example:

      using System;

      using System.Collections.Generic;

      using System.ComponentModel;

      using System.Data;

      using System.Drawing;

      using System.Linq;

      using System.Text;

      using System.Threading.Tasks;

      using System.Windows.Forms;

      namespace WindowsFormsApp25 {

      public partial class Form1 : Form {

          public Form1()

          {

              InitializeComponent();

          }

          private void Form1_Load(object sender, EventArgs e)

          {

              ListBox mylist = new ListBox();

              mylist.Location = new Point(287, 109);

              mylist.Size = new Size(120, 95);

              mylist.ForeColor = Color.Purple;

              mylist.Items.Add(123);

              mylist.Items.Add(456);

              mylist.Items.Add(789);

              this.Controls.Add(mylist);

          }

      }

      }

      Output:

    Soft17

    5 / 5 / 3

    Регистрация: 15.01.2017

    Сообщений: 690

    1

    16.01.2019, 20:50. Показов 8422. Ответов 11

    Метки нет (Все метки)


    Как сделать:
    1. Увеличить высоту строки (item) или расстояние между «item».
    А то слишком плотно.
    2. Увеличить высоту шрифта.
    3. Сделать чтобы если строка содержит:
    — «Успех» — то строка зелёного цвета;
    — «Ошибка» — то строка красного цвета;

    Пробую сделать… не получается..

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    
     public void InfoError()
            {
                string info = "Ошибка";
                listBox1.ItemHeight = 60; 
     
                listBox1.Items.Add(info);
            }
     
     
            public void InfoSuccess()
            {
                string info = "Успех";
                listBox1.Items.Add(info);
     
            }
     
            private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
                e.DrawBackground();
                e.DrawFocusRectangle();
     
                // You'll change the font size here. Notice the 20
                // e.Graphics.DrawString(e.Index, new Font(FontFamily.GenericSansSerif, 20, FontStyle.Bold), new SolidBrush(e.Index), e.Bounds);
     
                //e.Graphics.DrawString(listBox1.Items[e.Index].ToString,
                //                     listBox1.Font, Brushes.Black,
                //                     e.Bounds.Left, (
                //                     (e.Bounds.Height - listBox1.Font.Height)) + e.Bounds.Top);
     
                // e.DrawBackground(); //Draw our regular background
     
                // e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), 1, listBox1.Items[e.Index].ToString().Length - 1), e.Font, Brushes.Red, e.Bounds);    //Draw the item text in red!
     
                // e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds); //Draw the item text in its regular color
     
                    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), 1, listBox1.Items[e.Index].ToString().Length - 1), e.Font, Brushes.Red, e.Bounds);    //Draw the item text in red!
                
                    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(), e.Font, Brushes.Black, e.Bounds); //Draw the item text in its regular color
                
     
     
            }
     
            private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
            {
                e.ItemHeight = 25;
            }
     
            // Ошибка
            private void button1_Click(object sender, EventArgs e)
            {
                InfoError();
            }
     
            // Успех
            private void button2_Click(object sender, EventArgs e)
            {
                InfoSuccess();
            }

    Миниатюры

    ListBox. Как увеличить размер item?
     

    __________________
    Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



    0



    Aferuga

    635 / 522 / 322

    Регистрация: 20.05.2015

    Сообщений: 1,455

    17.01.2019, 04:18

    2

    Лучший ответ Сообщение было отмечено Soft17 как решение

    Решение

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    Пробую сделать… не получается..

    Потому что для начала надо поменять

    C#
    1
    
    listBox1.DrawMode = DrawMode.OwnerDrawVariable;

    в коде, либо в дизайнере.

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    1. Увеличить высоту строки (item) или расстояние между «item».

    Это есть у вас 46 строке.

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    2. Увеличить высоту шрифта.

    Проще конечно просто в дизайнере поменять, но можно и как-то так:

    C#
    1
    2
    3
    4
    5
    6
    
                Font ft = new System.Drawing.Font("Microsoft Sans Serif",
                    12F, //собственно сам размер
                    System.Drawing.FontStyle.Regular,
                    System.Drawing.GraphicsUnit.Point, 
                    ((byte)(204)));
                listBox1.Font = ft;

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    3. Сделать чтобы если строка содержит:
    — «Успех» — то строка зелёного цвета;
    — «Ошибка» — то строка красного цвета;

    Кликните здесь для просмотра всего текста

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
            private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
                //чтобы не потерять выделение итема
                if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                {
                    e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds);
                }
                else
                {
                    e.Graphics.FillRectangle(Brushes.Beige, e.Bounds);
                }
    ListBox lb = (ListBox)sender;            
    if (lb.Items[e.Index].ToString() == "Ошибка")
                    e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, Brushes.Red, e.Bounds);
                else e.Graphics.DrawString(lb.Items[e.Index].ToString(), e.Font, Brushes.Green, e.Bounds); 
                e.DrawFocusRectangle();
    }



    1



    5 / 5 / 3

    Регистрация: 15.01.2017

    Сообщений: 690

    17.01.2019, 08:39

     [ТС]

    3

    Цитата
    Сообщение от Aferuga
    Посмотреть сообщение

    Проще конечно просто в дизайнере поменять, но можно и как-то так:

    Не могли бы вы прислать скрин или более подробнее описать?

    Я пробую изменить: «ItemHeight».
    Исходное значение «ItemHeight»=13.
    Я ставлю — 20, а «ItemHeight» не меняется и становится опять — 13.

    Миниатюры

    ListBox. Как увеличить размер item?
     



    0



    Эксперт .NETАвтор FAQ

    10365 / 5096 / 1824

    Регистрация: 11.01.2015

    Сообщений: 6,226

    Записей в блоге: 34

    17.01.2019, 09:05

    4

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    Я пробую изменить: «ItemHeight».
    Исходное значение «ItemHeight»=13.
    Я ставлю — 20, а «ItemHeight» не меняется и становится опять — 13.

    Это потому, что высота Item зависит от шрифта. Увеличьте размер шрифта, и увеличится размер ItemHeight.
    Либо, выставьте значение DrawMode = OwnerDrawFixed. Но в этом случае, вам придется самостоятельно рисовать текст в элементах списка.

    А вообще, если это для проф разработки, то я бы рекомендовал использовать альтернативные реализации ListBox. Например FastList.
    Встроенные компоненты типа ListBox, TreeView, ComboBox — слишком завязаны на WinAPI и практически не поддаются кастомизации.



    2



    Soft17

    5 / 5 / 3

    Регистрация: 15.01.2017

    Сообщений: 690

    17.01.2019, 12:21

     [ТС]

    5

    Aferuga,
    Используя предложенный вами код я получаю — см. рисунок 1.

    Не могли бы вы немного подкорректировать код, чтобы получить описанный ниже результат
    Условие:
    — Если текст содержит — «Успех»: то строка «зелёного» цвета, шрифт текста — чёрный;
    — Если текст содержит — «Ошибка»: то строка «красного» цвета, шрифт текста — белый(!);
    — Остальные случаи: строка «белого» цвета, шрифт текста — чёрный;

    Я взял пример отсюда — ссылка.
    Скорректировал

    Кликните здесь для просмотра всего текста

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    //global brushes with ordinary/selected colors
            // глобальные кисти с обычными / выбранными цветами
            private SolidBrush reportsForegroundBrushSelected = new SolidBrush(Color.White);
            private SolidBrush reportsForegroundBrush = new SolidBrush(Color.Black);
     
            private SolidBrush reportsBackgroundBrushSelected = new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));
            private SolidBrush reportsBackgroundBrush1 = new SolidBrush(Color.LimeGreen);
            private SolidBrush reportsBackgroundBrush2 = new SolidBrush(Color.Salmon);
            private SolidBrush reportsBackgroundBrush3 = new SolidBrush(Color.White);
     
     private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
                e.DrawBackground();
                bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
     
                int index = e.Index;
                if (index >= 0 && index < listBox1.Items.Count)
                {
                    string text = listBox1.Items[index].ToString();
                    Graphics g = e.Graphics;
     
                    //background:
                    SolidBrush backgroundBrush;
                    if (selected)
                    {
                        backgroundBrush = reportsBackgroundBrushSelected;
                    }   
                    else
                    {
                        // if ((index % 2) == 0)
                        if (index.ToString().Contains("Успех"))
                        {
                            backgroundBrush = reportsBackgroundBrush1;
                        }
                        else
                        {
                            backgroundBrush = reportsBackgroundBrush2;
                        }
                    }
                    
     
                        g.FillRectangle(backgroundBrush, e.Bounds);
     
                    //text:
                    SolidBrush foregroundBrush = (selected) ? reportsForegroundBrushSelected : reportsForegroundBrush;
                    g.DrawString(text, e.Font, foregroundBrush, listBox1.GetItemRectangle(index).Location);
                }
     
                e.DrawFocusRectangle();
     
     
            }

    Но получаю результат — см. рисунок 2

    Цитата
    Сообщение от Storm23
    Посмотреть сообщение

    А вообще, если это для проф разработки, то я бы рекомендовал использовать альтернативные реализации ListBox. Например FastList.

    Буду пробовать.

    Изображения

      



    0



    Aferuga

    635 / 522 / 322

    Регистрация: 20.05.2015

    Сообщений: 1,455

    18.01.2019, 08:21

    6

    Лучший ответ Сообщение было отмечено Soft17 как решение

    Решение

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    Не могли бы вы прислать скрин или более подробнее описать?

    Я же в самом начале написал что надо DrawMode поменять, если поменяете его в дизайнере, то сможете изменять ItemHeight там же в дизайнере.

    Цитата
    Сообщение от Soft17
    Посмотреть сообщение

    Условие:
    — Если текст содержит — «Успех»: то строка «зелёного» цвета, шрифт текста — чёрный;
    — Если текст содержит — «Ошибка»: то строка «красного» цвета, шрифт текста — белый(!);
    — Остальные случаи: строка «белого» цвета, шрифт текста — чёрный;

    Тогда так:

    Кликните здесь для просмотра всего текста

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
            private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
            {
    ListBox lb = (ListBox)sender;  
                string text = lb.Items[e.Index].ToString(); 
                if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                {
                    e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds);
                }
                else
                {
                    if (text.Contains("Успех")) e.Graphics.FillRectangle(Brushes.Green, e.Bounds);
                    else
                        if (text.Contains("Ошибка")) e.Graphics.FillRectangle(Brushes.Red, e.Bounds);
                        else
                            e.Graphics.FillRectangle(Brushes.White, e.Bounds);
                }
              
    if (text.Contains("Ошибка"))
                    e.Graphics.DrawString(text, e.Font, Brushes.White, e.Bounds);
                else e.Graphics.DrawString(text, e.Font, Brushes.Black, e.Bounds); 
                e.DrawFocusRectangle();
    }



    2



    3 / 3 / 0

    Регистрация: 14.07.2014

    Сообщений: 13

    27.03.2019, 13:26

    7

    Цитата
    Сообщение от Aferuga
    Посмотреть сообщение

    Тогда так:

    Извините, а не подскажите, как бы теперь убрать перенос строк по словам?
    Взял ваш последний код.
    Некоторые строки не вмещаются в одну и переносятся на следующую, но из-за этого(наверное из-за этого) строки, которые изначально вмещались в одну, тоже стали занимать 2. Как бы это исправить?

    Скрин:
    http://skrinshoter.ru/s/270319/3Av0pYPa?a



    1



    Aferuga

    635 / 522 / 322

    Регистрация: 20.05.2015

    Сообщений: 1,455

    01.04.2019, 03:39

    8

    Цитата
    Сообщение от Alexis95
    Посмотреть сообщение

    но из-за этого(наверное из-за этого) строки,

    не из-за этого, а из-за указанного размера ItemHeight, если нужно чтобы размер итема изменялся в зависимости от количества строк в нём, то можно сделать как-то так:

    Кликните здесь для просмотра всего текста

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
     private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
            {
                ListBox lb = (ListBox)sender; 
                Size sz = new Size(lb.ClientSize.Width, int.MaxValue);
                TextFormatFlags flags = TextFormatFlags.WordBreak;
                int padding = 3;
                int borders = lb.Height - lb.ClientSize.Height;
                sz = TextRenderer.MeasureText(lb.Items[e.Index].ToString(), lb.Font, sz, flags);
                int h = sz.Height + borders + padding;
                if (lb.Top + h > this.ClientSize.Height - 10)
                {
                    h = this.ClientSize.Height - 10 - lb.Top;
                }
                e.ItemHeight = h;
                if (lb.Items[e.Index].ToString() == "") e.ItemHeight = 20;
            }



    2



    3 / 3 / 0

    Регистрация: 14.07.2014

    Сообщений: 13

    01.04.2019, 11:28

    9

    Здорово, спасибо!
    А можно ещё один момент?
    Почему ползунки не работают? Я их включил, полосы появились, но двигать нечего, хотя текст за границей.

    listBox1.HorizontalScrollbar = true;
    listBox1.ScrollAlwaysVisible = true;

    http://skrinshoter.ru/s/010419/3FXrmpd7?a



    1



    Aferuga

    635 / 522 / 322

    Регистрация: 20.05.2015

    Сообщений: 1,455

    02.04.2019, 04:35

    10

    Цитата
    Сообщение от Alexis95
    Посмотреть сообщение

    Почему ползунки не работают?

    Мой код выше подразумевает, что будет перенос строки и не будет горизонтальной строки прокрутки.

    Добавлено через 5 часов 4 минуты
    В случае если нужна полоса прокрутки, то делаем так:

    Кликните здесь для просмотра всего текста

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
     private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
            {
                ListBox lb = (ListBox)sender; 
                Size sz = new Size(int.MaxValue, int.MaxValue);
                //Убираем перенос слов 
                //TextFormatFlags flags = TextFormatFlags.WordBreak;
                int padding = 3;
                int borders = lb.Height - lb.ClientSize.Height;
                sz = TextRenderer.MeasureText(lb.Items[e.Index].ToString(), lb.Font, sz);
                int h = sz.Height + borders + padding;
                if (lb.Top + h > this.ClientSize.Height - 10)
                {
                    h = this.ClientSize.Height - 10 - lb.Top;
                }
                e.ItemHeight = h;
                e.ItemWidth = sz.Width;//добавляем размер
                if (e.ItemWidth > lb.HorizontalExtent) lb.HorizontalExtent = e.ItemWidth; //задаем длину полосы
     
                if (lb.Items[e.Index].ToString() == "") e.ItemHeight = 20;
            }



    1



    3 / 3 / 0

    Регистрация: 14.07.2014

    Сообщений: 13

    02.04.2019, 14:59

    11

    Извиняюсь, полоса прокрутки есть(была и до этого), а вот ползунок появляться не хочет…



    1



    635 / 522 / 322

    Регистрация: 20.05.2015

    Сообщений: 1,455

    03.04.2019, 05:33

    12

    Цитата
    Сообщение от Alexis95
    Посмотреть сообщение

    Извиняюсь, полоса прокрутки есть(была и до этого),

    Да это понятно выше я имел ввиду рабочую полосу прокрутки.

    Цитата
    Сообщение от Alexis95
    Посмотреть сообщение

    а вот ползунок появляться не хочет…

    В моём предыдущем комментарии я уже написал решение.



    1



    IT_Exp

    Эксперт

    87844 / 49110 / 22898

    Регистрация: 17.06.2006

    Сообщений: 92,604

    03.04.2019, 05:33

    12

    В Windows Forms элемент управления ListBox используется для отображения нескольких элементов в списке, из которого пользователь может выбрать один или несколько элементов, и элементы обычно отображаются в нескольких столбцах. В ListBox вам разрешено устанавливать высоту и ширину ListBox в пикселях, используя свойство Size ListBox, что делает ваш ListBox более привлекательным. Вы можете установить это свойство двумя разными способами:

    1. Design-Time: It is the easiest way to set the size of the ListBox as shown in the following steps:

    2. RunTime: It is a little bit trickier than the above method. In this method, you can set the size of the ListBox control programmatically with the help of given syntax:

    public System.Drawing.Size Size { get; set; }

    Here, Size indicates the height and width of the ListBox in pixels. The following steps show how to set the size of the ListBox dynamically:

    • Step 1: Create a list box using the ListBox() constructor is provided by the ListBox class.
      // Creating ListBox using ListBox class constructor
      ListBox mylist = new ListBox();
      
    • Step 2: After creating ListBox, set the Size property of the ListBox provided by the ListBox class.
      // Setting the size of the ListBox
       mylist.Size = new Size(120, 95);
      
    • Step 3: And last add this ListBox control to the form using Add() method.
      // Add this ListBox to the form
      this.Controls.Add(mylist);
      

      Example:

      using System;

      using System.Collections.Generic;

      using System.ComponentModel;

      using System.Data;

      using System.Drawing;

      using System.Linq;

      using System.Text;

      using System.Threading.Tasks;

      using System.Windows.Forms;

      namespace WindowsFormsApp25 {

      public partial class Form1 : Form {

          public Form1()

          {

              InitializeComponent();

          }

          private void Form1_Load(object sender, EventArgs e)

          {

              ListBox mylist = new ListBox();

              mylist.Location = new Point(287, 109);

              mylist.Size = new Size(120, 95);

              mylist.ForeColor = Color.Purple;

              mylist.Items.Add(123);

              mylist.Items.Add(456);

              mylist.Items.Add(789);

              this.Controls.Add(mylist);

          }

      }

      }

      Output:

    Последнее обновление: 31.10.2015

    Элемент ListBox представляет собой простой список. Ключевым свойством этого элемента является свойство Items, которое как раз и хранит набор
    всех элементов списка.

    Элементы в список могут добавляться как во время разработки, так и программным способом. В Visual Studio в окне Properties (Свойства) для
    элемента ListBox мы можем найти свойство Items. После двойного щелчка на свойство нам отобразится окно для добавления элементов в список:

    Добавление объектов в элемент ListBox

    В пустое поле мы вводим по одному элементу списка — по одному на каждой строке. После этого все добавленные нами элементы окажутся
    в списке, и мы сможем ими управлять:

    Элемент ListBox в Windows Forms

    Программное управление элементами в ListBox

    Добавление элементов

    Итак, все элементы списка входят в свойство Items, которое представляет собой коллекцию. Для добавления нового элемента в
    эту коллекцию, а значит и в список, надо использовать метод Add, например: listBox1.Items.Add("Новый элемент");.
    При использовании этого метода каждый добавляемый элемент добавляется в конец списка.

    Можно добавить сразу несколько элементов, например, массив. Для этого используется метод AddRange:

    string[] countries = { "Бразилия", "Аргентина", "Чили", "Уругвай", "Колумбия" };
    listBox1.Items.AddRange(countries);
    

    Вставка элементов

    В отличие от простого добавления вставка производится по определенному индексу списка с помощью метода Insert:

    listBox1.Items.Insert(1, "Парагвай");
    

    В данном случае вставляем элемент на вторую позицию в списке, так как отсчет позиций начинается с нуля.

    Удаление элементов

    Для удаления элемента по его тексту используется метод Remove:

    listBox1.Items.Remove("Чили");
    

    Чтобы удалить элемент по его индексу в списке, используется метод RemoveAt:

    listBox1.Items.RemoveAt(1);
    

    Кроме того, можно очистить сразу весь список, применив метод Clear:

    listBox1.Items.Clear();
    

    Доступ к элементам списка

    Используя индекс элемента, можно сам элемент в списке. Например, получим первый элемент списка:

    string firstElement = listBox1.Items[0];
    

    Свойство Count возвращает количество элементов в списке:

    int number = listBox1.Items.Count;
    

    Выделение элементов списка

    При выделении элементов списка мы можем ими управлять как через индекс, так и через сам выделенный элемент. Получить выделенные
    элементы можно с помощью следующих свойств элемента ListBox:

    • SelectedIndex: возвращает или устанавливает номер выделенного элемента списка. Если выделенные элементы отсутствуют, тогда
      свойство имеет значение -1

    • SelectedIndices: возвращает или устанавливает коллекцию выделенных элементов в виде набора их индексов

    • SelectedItem: возвращает или устанавливает текст выделенного элемента

    • SelectedItems: возвращает или устанавливает выделенные элементы в виде коллекции

    По умолчанию список поддерживает выделение одного элемента. Чтобы добавить возможность выделения нескольких элементов,
    надо установить у его свойства SelectionMode значение MultiSimple.

    Чтобы выделить элемент програмно, надо применить метод SetSelected(int index, bool value),
    где index — номер выделенного элемента. Если второй параметр — value имеет значение true, то элемент по указанному индексу
    выделяется, если false, то выделение наоборот скрывается:

    listBox1.SetSelected(2, true); // будет выделен третий элемент
    

    Чтобы снять выделение со всех выделенных элементов, используется метод ClearSelected.

    Событие SelectedIndexChanged

    Из всех событий элемента ListBox надо отметить в первую очередь событие SelectedIndexChanged, которое возникает при изменении выделенного элемента:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
    
            string[] countries = { "Бразилия", "Аргентина", "Чили",  "Уругвай", "Колумбия" };
            listBox1.Items.AddRange(countries);
            
    		listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged;
        }
    
        void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string selectedCountry = listBox1.SelectedItem.ToString();
            MessageBox.Show(selectedCountry);
        }
    }
    

    В данном случае по выбору элемента списка будет отображаться сообщение с выделенным элементом.

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    я смотрел информацию по этому вопросу. Есть варианты как изменить размер формы мышкой, наверное с привязкой к форме можно изменить размер ListBox-а, а к чему привязаться чтобы можно было(автоматически) задать сколько строк в ListBox показывать при изменении размеров формы.

    Может я не заметил обсуждений,подскажите

     

    Jungl

    Пользователь

    Сообщений: 830
    Регистрация: 18.01.2016

    grig, не совсем понятен вопрос относящийся к названию темы. Ну и примера нет(хоть картинкой, главное понять как ВЫ это видите/хотите).
    У листбокс строчки зависят от кол-ва занесенных данных, на то он листбокс, где присутствует скролл.
    Или вы имеете ввиду- расширять размер формы+привязанный к ней листбокс в зависимости от кол-ва занесенных данных?

     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    Я понял так: меняем размер формы — меняется ВЫСОТА ЛистБокса. И, соответственно, количество видимых строк в нём.

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    все правильно и главное — автоматически

     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #5

    27.12.2016 23:45:05

    Цитата
    grig написал:
    к чему привязаться чтобы можно было(автоматически) задать сколько строк в ListBox показывать при изменении размеров формы.

    А привязываться не нужно: изменение размера ЛистБокса повлечёт за собой изменение количества видимых строк.

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    #6

    28.12.2016 00:31:53

    я имел в виду, чтобы процедура, которая отвечает за количество видимых строк — понимала, сколько строк надо вывести

    Цитата
    grig написал:
    к чему привязаться чтобы можно было(автоматически) задать сколько строк в ListBox показывать при изменении размеров формы
     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #7

    28.12.2016 00:37:12

    Цитата
    grig написал:
    чтобы процедура, которая отвечает за количество видимых строк — понимала, сколько строк надо вывести

    Не нужно никакой процедуры. Да и нет такой: сколько в окно ЛистБокса поместится строк, столько и будет.

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    процедура в listBox выдает 20 строк(из массива на 20 значений). Если в listBox и на форме видно 20 строк, а после уменьшения формы и бокса будет видно только 5(остальные по идее будут или в скролле или не видны). Хотелось бы чтобы процедура после уменьшения формы понимала, что будет видно только 5 строк и массив превращается в массив на 5 значений и их выдает, а после увеличения формы и бокса выдавала — 20(массив превращается в массив на 20 значений).

    5 и 20 это неважно(мне кажется это удобно — 5 это минимум,а 20 максимум). Можно плавно можно скачком. Главное при уменьшении показывает меньше значений(но все), а при увеличении тоже все и чтобы не было пустого места в listbox-е(форму уменьшают чтобы удобнее было работать, большая мешает).

    Я не упомянул про массив, поэтому наверно не очень было понятно

     

    vikttur

    Пользователь

    Сообщений: 47199
    Регистрация: 15.09.2012

    #9

    28.12.2016 01:05:33

    Цитата
    и массив [из двадцати] превращается в массив на 5 значений и их выдает

    Совершенно не понимаю, зачем такие извращения? Если список не помещается в поле, то появляется полоса прокрутки.
    По Вашему варианту — как Вы увидите следующие 15 значений? Опять перезаписывать список?

    Да и «гуляние» размеров ListBox… Со сколькими формами работал, но ни разу не возникала такая потребность. Иногда задействовалось изменение высоты формы, чтобы скрыть/показать чего-нибудь (например, блок информации/подсказок). Но менять поля и резать списки…

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    #10

    28.12.2016 01:13:29

    Цитата
    [USER=7]vikttur[/USER] написал:
    как Вы увидите следующие 15 значений? Опять перезаписывать список?

    Вы исходите из того, что все 20 значений необходимы и они не так часто нужны, чтобы их выискивать с помощью полосы прокрутки. У меня другая ситуация. Желательно без полос прокрутки, а при желании увеличить количество строк в listbox-e

    Я не список режу я изменяю размер массива. Информация в массиве может изменяться быстрее, тогда(если надо) я увеличиваю размер массива(размером ListBox) или информация приходит медленнее и мне 5 строк хватает

    Изменено: grig28.12.2016 01:17:57

     

    С.М.

    Пользователь

    Сообщений: 934
    Регистрация: 22.12.2012

    #11

    28.12.2016 04:45:41

    Скрытый текст

    Прикрепленные файлы

    • Форма со списком.xlsb (25.2 КБ)

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    С.М.
    Если исходить из вашего примера(я понял, что в нем при уменьшении формы появляется полоса прокрутки), то мне надо уменьшение количества букв в столбце «А».
    Если форма большая, то видны все буквы, а если форму уменьшить в два раза, то будут показываться только половина букв(а остальных — нету), а если опять сделать форму большой, то показываются все буквы
    (массив на 20 значений,как только 20-е значение заполнятся, то первое значение очищается и все значения смещаются к началу и двадцатое значение освобождается и в него записывается информация, потом опять первое значение очищается все смещается и так по кругу.)

    Если я уменьшу форму, то у меня значения не пропадут т.к. значение массива уменьшится(было 20, а станет 10(5)), но все равно вся информация будет через массив проходить

     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #13

    28.12.2016 12:02:05

    Цитата
    grig написал:
    чтобы не было пустого места в listbox

    grig, Вы никак не поймёте: у ЛистБокса нет свойства ListRows. У КомбоБокса есть, а у ЛистБокс нет. Количество отображаемых строк будет зависить от высоты ЛистБокса. Ну и от размера шрифта, разумеется.

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    значит будем переходить на КомбоБокс

     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    В целом замысел не очень понятен, но можно подменять ЛистБокс его дубликатом (меньшей высоты), поместив его в ту же позицию: когда размер формы большой — дубликат скрыт, и отображается основной ЛистБокс. Если размер маленький — основной скрываем, отображаем дублёр и в него отбираем нужное количество строк из основного массива.

     

    vikttur

    Пользователь

    Сообщений: 47199
    Регистрация: 15.09.2012

    #16

    28.12.2016 16:34:26

    Цитата
    будем переходить на КомбоБокс

    ?
    Нажимать на кнопку выпадающего списка приятнее, чем видеть/не видеть какие-то строки?

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    там вроде есть режим — простой список, а кнопку можно убрать в свойствах

     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #18

    28.12.2016 19:17:23

    Цитата
    grig написал: кнопку можно убрать в свойствах

    Раскрывать КомбоБокс как будете? Программно?
    Вот зачем Вы себе создаёте проблемы? ))
    #15 читали? Не вариант?

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    #19

    28.12.2016 20:15:10

    Цитата
    Юрий М написал: #15 читали? Не вариант?

    тоже вариант,сделать несколько форм, отслеживать по высоте и выбирать нужную форму.

    Я сейчас перешел на не модальную форму(своя специфика). Определюсь что важнее, а там видно будет

     

    Юрий М

    Модератор

    Сообщений: 60394
    Регистрация: 14.09.2012

    Контакты см. в профиле

    #20

    28.12.2016 20:18:42

    Цитата
    grig написал: тоже вариант,сделать несколько форм

    Я не говорил про несколько ФОРМ ))

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    #22

    28.12.2016 22:23:45

    Кому-то я уже подобное отправлял… Но эта фишка по сути своей костыль костылем, но работает… Но работает с внешним запуском (я использовал MouseMove), т. к. некое свойство ListBox.IntegralHeight, отвечающее за подгонку ТОЛЬКО ОДНОЙ строки (с округлением по высоте вниз до ближайшей целой), отрабатывает свою задачу ТОЛЬКО по выходу из процедуры. Сколько надо строк, столько запусков. Может, конечно и есть какие-нибудь задачи в которых такое требуется, но это больше на прикол смахивает…  ;)

    Код
    Sub Podgonka_dobavkoy_po_odnomu()
    Static currentVisibleCount As Long 'помнит кол-во видимых строк
    Dim maxScreenVisibleCount As Integer
    maxScreenVisibleCount = 60 'чтоб за экран не вылезало задать самому на свое усмотрение
    With Me.ListBox1
        If .Height < 6 Then currentVisibleCount = 0 'начальные условия
        If currentVisibleCount >= maxScreenVisibleCount Then Exit Sub
        If currentVisibleCount < .ListCount _
            Then currentVisibleCount = currentVisibleCount + 1 Else Exit Sub
        .IntegralHeight = False 'отключаем подгонку, чтоб при включении произошло событие
        .Height = .Height + 15 '15 зависит от размера шрифта, но держит широкий диапазон
        .IntegralHeight = True 'включаем, но подгонка произойдет после окончания процедуры
        Me.Height = .Height + 70
        Me.CommandButton1.Top = .Height + 10
        Me.CommandButton2.Top = .Height + 10
    End With
    End Sub
    
    Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Podgonka_dobavkoy_po_odnomu
    End Sub
    
    Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Podgonka_dobavkoy_po_odnomu
    End Sub
    

    Прикрепленные файлы

    • заданное кол-во строк ListBox.xlsm (63.18 КБ)

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    #23

    29.12.2016 04:19:32

    Цитата
    AAF написал: Сколько надо строк, столько запусков

    не знаю, у вас в программе она отрабатывает на то количество строк, что задано и если исходить из того что размеры задавать должен массив — то большего и не надо. Но у меня размерность задаю я, поэтому ее надо переделать, но благодаря вам есть с чем работать. Большое спасибо

     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    #24

    29.12.2016 09:57:31

    Цитата
    maxScreenVisibleCount = 60 ‘чтоб за экран не вылезало задать самому на свое усмотрение

    Задаете Вы. Кроме того можете ограничивать высоту, но при этом уже знать кол-во строк. И последнее… Если у Вас есть посторонний и постоянный источник событий, то и MouseMove Вам не нужен…  :)

     

    grig

    Пользователь

    Сообщений: 160
    Регистрация: 09.09.2016

    #25

    29.12.2016 11:01:48

    Цитата
    AAF написал: Задаете Вы

    Я это понял, но неправильно написал. Если размер массива не меняется, то и ваша программа не нужна, а если меняется, то ваша программа очень удобна, но ее надо подстроить под свои нужды. Вашу программу мне удобно под себя подстроить, но только я сейчас нахожусь еще в поиске(установил себе multipage, чтобы на второй странице установить  настройки(привязывать или нет к активной ячейке и др), каких размеров формы мне нужны, какие настройки в них нужны. Когда я программу обкатаю тогда и приступлю к окончательной доводке. Еще раз спасибо за программу

    Изменено: grig29.12.2016 12:34:40

     

    С.М.

    Пользователь

    Сообщений: 934
    Регистрация: 22.12.2012

    #26

    29.12.2016 14:05:30

    Скрытый текст

    Прикрепленные файлы

    • Форма со списком.2.xlsb (24.04 КБ)

     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    #27

    29.12.2016 15:38:06

    Работает… А где можно получить значения констант? :qstn:

    Цитата
    Const A1 As Single = 2.99, B1 As Single = 9.76
     

    С.М.

    Пользователь

    Сообщений: 934
    Регистрация: 22.12.2012

    AAF, я применил Ваш файл (спасибо !)  для расчёта зависимости высоты листбокса от числа его элементов.

     

    AAF

    Пользователь

    Сообщений: 1000
    Регистрация: 18.12.2016

    Ну вот…  :cry: А я обрадовался, что можно высчитать как-то…
    Я пробовал, но при различных фонтах поведение разное. при одних высота ListBox растет на точно фиксированное значение, а при других прирост каждой строки по размеру не одинаково Поэтому попытки вычислений не всегда приводят к точным константам, и при большом кол-ве строк эта погрешность набегает к последней строке и не всегда, к сожалению, положительная, а при отрицательной ListBox.IntegralHeight съедает последнюю строку.

     

    Jungl

    Пользователь

    Сообщений: 830
    Регистрация: 18.01.2016

    #30

    29.12.2016 23:47:49

    Вариант со SpinButton. Размеры шрифта не мешают.
    p.s. мне одному кажется странным такое кол-во просмотров темы?))

    Прикрепленные файлы

    • FormHeight.xlsm (20.47 КБ)

    Понравилась статья? Поделить с друзьями:

    Читайте также:

  • Как изменить размер label visual studio
  • Как изменить размер label html
  • Как изменить размер label css
  • Как изменить размер jtextfield
  • Как изменить размер jar файла

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии