Textbox c и listbox в чем разница
Перейти к содержимому

Textbox c и listbox в чем разница

  • автор:

Textbox c и listbox в чем разница

Элемент 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); >>

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

Textbox c и listbox в чем разница

Для ввода и редактирования текста предназначены текстовые поля — элемент TextBox. Так же как и у элемента Label текст элемента TextBox можно установить или получить с помощью свойства Text.

По умолчанию при переносе элемента с панели инструментов создается однострочное текстовое поле. Для отображения больших объемов информации в текстовом поле нужно использовать его свойства Multiline и ScrollBars . При установке для свойства Multiline значения true, все избыточные символы, которые выходят за границы поля, будут переноситься на новую строку.

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

Элемент TextBox в Windows Forms

  • None : без прокруток (по умолчанию)
  • Horizontal : создает горизонтальную прокрутку при длине строки, превышающей ширину текстового поля
  • Vertical : создает вертикальную прокрутку, если строки не помещаются в текстовом поле
  • Both : создает вертикальную и горизонтальную прокрутку

Автозаполнение текстового поля

Элемент TextBox обладает достаточными возможностями для создания автозаполняемого поля. Для этого нам надо привязать свойство AutoCompleteCustomSource элемента TextBox к некоторой коллекции, из которой берутся данные для заполнения поля.

Итак, добавим на форму текстовое поле и пропишем в код события загрузки следующие строки:

public partial class Form1 : Form < public Form1() < InitializeComponent(); AutoCompleteStringCollection source = new AutoCompleteStringCollection() < "Кузнецов", "Иванов", "Петров", "Кустов" >; textBox1.AutoCompleteCustomSource = source; textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; > >

Автозаполнение текстового поля

Режим автодополнения, представленный свойством AutoCompleteMode , имеет несколько возможных значений:

  • None : отсутствие автодополнения
  • Suggest : предлагает варианты для ввода, но не дополняет
  • Append : дополняет введенное значение до строки из списка, но не предлагает варианты для выбора
  • SuggestAppend : одновременно и предлагает варианты для автодополнения, и дополняет введенное пользователем значение

Перенос по словам

Чтобы текст в элементе TextBox переносился по словам, надо установить свойство WordWrap равным true . То есть если одно слово не умещается на строке, то но переносится на следующую. Данное свойство будет работать только для многострочных текстовых полей.

Ввод пароля

Также данный элемент имеет свойства, которые позволяют сделать из него поле для ввода пароля. Так, для этого надо использовать PasswordChar и UseSystemPasswordChar .

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

Свойство UseSystemPasswordChar имеет похожее действие. Если мы установим его значение в true , то вместо введенных символов в текстовом поле будет отображаться знак пароля, принятый в системе, например, точка.

Событие TextChanged

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

public partial class Form1 : Form < public Form1() < InitializeComponent(); textBox1.TextChanged += textBox1_TextChanged; >private void textBox1_TextChanged(object sender, EventArgs e) < label1.Text = textBox1.Text; >>

Textbox c и listbox в чем разница

Название форума

Как опоределить первую . (БМВ) 28.01.2024 22:48:14

Глюк Excel 2007 — карти. (vikttur) 29.01.2017 17:28:40

Хранение файлов и файло. (bedvit) 28.06.2018 15:25:11

Копирования значений в . (Tracksimus) 27.01.2024 22:47:44

Excel. Смещён временной. (Айнур Серик) 29.01.2024 01:16:23

Формулы Plex (Пользователь Google) 28.01.2024 21:36:18

Универсал пикчерс метод. (Andr85) 27.01.2024 20:59:16

Режим Read only при вхо. (БМВ) 25.01.2024 19:29:58

Сейчас на форуме

Всего зарегистрированных пользователей: 130538

Приняло участие в обсуждении: 48239

Всего тем: 152700

Всего сообщений: 1201326

есть новые сообщения

нет новых сообщений

© Николай Павлов, Planetaexcel, 2006-2023
info@planetaexcel.ru

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

ООО «Планета Эксел»
ИНН 7735603520
ОГРН 1147746834949
ИП Павлов Николай Владимирович
ИНН 633015842586
ОГРНИП 310633031600071

Элемент управления ListBox

В последней статье мы получили представление о ItemsControl, представляющий собой простейший список в WPF. ListBox является следующем элементом управления по этому направлению, который имеет немного расширенную функциональность. Одним из главных отличий является факт что элемент управления ListBox позволяет произвести различные варианты выбора — позволяет конечному пользователю выбрать один или несколько элементов списка и автоматически получить визуальный отклик на данное действие.

Ниже приведен пример очень простого использования элемента управления ListBox:

   ListBox Item #1 ListBox Item #2 ListBox Item #3   

Если кратко: Мы декларируем элемент управления ListBox, внутри его определяем три элемента (ListBoxItem’s) с своим текстом. Несмотря на то, что ListBoxItem является ContentControl, мы можем переопределить его содержание:

      ListBox Item #1     ListBox Item #2     ListBox Item #3     

Для каждого ListBoxItem мы сейчас добавили StackPanel, в которой мы добавили элементы Image и TextBlock, что предоставило полное управление содержанием такое как визуализация текста, как вы можете увидеть на скриншоте, где различные цвета используются для каждого числа.

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

Привязка данных к ListBox

Установка элементов списка ListBox вручную годится для первого примера, но в большинстве случаев ваш ListBox будет заполнятся элементами из источника данных через привязку. По умолчанию, привязанные к ListBox элементы отображаются с помощью их метода ToString(). Но этот вариант не всегда подходит, поэтому мы можем объявить шаблон, который будет использоваться для представления каждого элемента списка.

Для примера я снова реализую такой же TODO список как из статьи про ItemsControl, где мы создавали классный список задач, используя простой класс с кодом, но теперь ещё и добавим элемент интерфейса ListBox для визуального представления. Вот пример:

using System; using System.Windows; using System.Collections.Generic; namespace WpfTutorialSamples.ListBox_control < public partial class ListBoxDataBindingSample : Window < public ListBoxDataBindingSample() < InitializeComponent(); Listitems = new List(); items.Add(new TodoItem() < Title = "Complete this WPF tutorial", Completion = 45 >); items.Add(new TodoItem() < Title = "Learn C#", Completion = 80 >); items.Add(new TodoItem() < Title = "Wash the car", Completion = 0 >); lbTodoList.ItemsSource = items; > > public class TodoItem < public string Title < get; set; >public int Completion < get; set; >> >

Вся магия происходит в шаблоне ItemTemplate, который мы определили для ListBox. Здесь мы указали, что каждый элемент ListBox должен состоять из Grid’а, разделенного на две колонки. TextBlock в первой колонке для названия и ProgressBar во второй для статуса. Чтобы установить их значения, используется очень простая привязка данных (подробно рассмотрено в части о привязках этой статьи).

В файле с исходным кодом мы объявили очень простой класс TodoItem для хранения каждого из наших элементов TODO. В конструкторе класса ListBoxDataBindingSample мы инициализировали List и добавили в него три объекта TodoItem, а затем назначили этот List как источник данных для элемента интерфейса ListBox, названного «lbTodoList» в XAML коде. Комбинация ItemsSource и ItemTemplate, которую мы указали в части XAML, — это все, что нужно WPF для отображения всех элементов ListBox в виде списка задач.

Обратите внимание на свойство HorizontalContentAlignment, которое установлено в Stretch для ListBox. Выравнивание по умолчанию для ListBox всегда Left, что означает, что ширина элемента зависит от его содержимого. Результат? Хм, не совсем то, что мы хотели:

При использовании Stretch выравнивания, каждый элемент растягивается и занимает все доступное пространство, как это показано на предыдущем скриншоте.

Работа с выделением в ListBox

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

       ListBox selection               " />     
using System; using System.Windows; using System.Collections.Generic; namespace WpfTutorialSamples.ListBox_control < public partial class ListBoxSelectionSample : Window < public ListBoxSelectionSample() < InitializeComponent(); Listitems = new List(); items.Add(new TodoItem() < Title = "Complete this WPF tutorial", Completion = 45 >); items.Add(new TodoItem() < Title = "Learn C#", Completion = 80 >); items.Add(new TodoItem() < Title = "Wash the car", Completion = 0 >); lbTodoList.ItemsSource = items; > private void lbTodoList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) < if(lbTodoList.SelectedItem != null) this.Title = (lbTodoList.SelectedItem as TodoItem).Title; >private void btnShowSelectedItem_Click(object sender, RoutedEventArgs e) < foreach(object o in lbTodoList.SelectedItems) MessageBox.Show((o as TodoItem).Title); >private void btnSelectLast_Click(object sender, RoutedEventArgs e) < lbTodoList.SelectedIndex = lbTodoList.Items.Count - 1; >private void btnSelectNext_Click(object sender, RoutedEventArgs e) < int nextIndex = 0; if((lbTodoList.SelectedIndex >= 0) && (lbTodoList.SelectedIndex < (lbTodoList.Items.Count - 1))) nextIndex = lbTodoList.SelectedIndex + 1; lbTodoList.SelectedIndex = nextIndex; >private void btnSelectCSharp_Click(object sender, RoutedEventArgs e) < foreach(object o in lbTodoList.Items) < if((o is TodoItem) && ((o as TodoItem).Title.Contains("C#"))) < lbTodoList.SelectedItem = o; break; >> > private void btnSelectAll_Click(object sender, RoutedEventArgs e) < foreach(object o in lbTodoList.Items) lbTodoList.SelectedItems.Add(o); >> public class TodoItem < public string Title < get; set; >public int Completion < get; set; >> >

Как вы можете видеть, я определил несколько кнопок справа от ListBox, и для получения или для управления выбранного элементом списка. Я также изменил обычный режим (SelectionMode) в расширенный (Extended), который позволил выбирать несколько элементов из списка. Это может быть сделано или программным способом, как я и сделал в этом примере, или самим пользователем, удерживая клавишу [Ctrl] или [Shift]при выборе элементов списка (щелкая мышкой на соответствующем элементе списка)

Для каждой кнопки я определил обработчик события Click. Каждое действие вполне объяснимо, используемый C# код достаточно простой, но если вам что-то непонятно, попробуйте запустить этот пример у себя и протестируйте все возможные варианты.

Заключение

ListBox очень похож на ItemsControl и он может использоваться в нескольких случаях точно также. Однако ListBox предоставляет больше возможностей относительно ItemsControl, особенно в случае необходимости выбора элемента. Если необходим расширенный функционал, как например наличие заголовков у колонок, вам необходимо взглянуть на ListView элемент, описание которого будет позже в руководстве и содержащее несколько статей объясняющие полный функционал ListView.

This article has been fully translated into the following languages:

Is your preferred language not on the list? Click here to help us translate this article into your language!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *