Перейти к основному содержимому

Справочник по WinForms — элементы UI


Назначение

Пошаговые рецепты Windows Forms на C#. Обзор платформы — 115.md; первая форма — там же. Имена элементов — Архитектура десктопных приложений; UI-поток — 112.md. Язык C# — раздел C#.

Примеры — кодом (без Designer); те же контролы можно перетаскивать из Toolbox в Visual Studio.


Как пользоваться

  1. Создайте форму Form и контейнер Panel или TableLayoutPanel.
  2. Добавьте контрол: Controls.Add(control) или в ячейку layout.
  3. Подпишите обработчик: control.Click += OnClick; или двойной клик по контролу в Designer.

UI обновляйте из UI-потока; из фона — control.Invoke(() => { ... }).


Главное окно (Form)

using System;
using System.Windows.Forms;

ApplicationConfiguration.Initialize();
var form = new Form
{
Text = "Моё приложение",
ClientSize = new Size(640, 480),
StartPosition = FormStartPosition.CenterScreen
};
Application.Run(form);

Program.cs (.NET 6+):

[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new MainForm());
}

.csproj: <UseWindowsForms>true</UseWindowsForms>, <TargetFramework>net8.0-windows</TargetFramework>.


Контейнер (Panel / TableLayoutPanel)

var panel = new Panel { Dock = DockStyle.Fill, Padding = new Padding(12) };
form.Controls.Add(panel);

var table = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 2,
RowCount = 4,
AutoSize = true
};
table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f));
panel.Controls.Add(table);

Label (метка)

var label = new Label
{
Text = "Имя пользователя:",
AutoSize = true,
Anchor = AnchorStyles.Left
};
table.Controls.Add(label, 0, 0);

label.Text = "Обновлено";

TextBox — однострочный

var textBox = new TextBox
{
Width = 240,
PlaceholderText = "Введите имя" // .NET 6+
};
table.Controls.Add(textBox, 1, 0);

string value = textBox.Text.Trim();
textBox.Clear();
textBox.Text = "по умолчанию";

textBox.KeyDown += (s, e) =>
{
if (e.KeyCode == Keys.Enter) Submit();
};

TextBox — многострочный

var notes = new TextBox
{
Multiline = true,
ScrollBars = ScrollBars.Vertical,
Height = 120,
Dock = DockStyle.Fill,
WordWrap = true
};
panel.Controls.Add(notes);
string text = notes.Text;

Поле пароля

var password = new TextBox
{
UseSystemPasswordChar = true,
Width = 200
};
// или MaskedTextBox с маской

Button (кнопка)

var save = new Button
{
Text = "Сохранить",
AutoSize = true,
DialogResult = DialogResult.None
};
save.Click += (s, e) => OnSave();
table.Controls.Add(save, 1, 3);

var ok = new Button { Text = "OK", DialogResult = DialogResult.OK };

CheckBox (флажок)

var notify = new CheckBox
{
Text = "Уведомления",
Checked = true,
AutoSize = true
};
notify.CheckedChanged += (s, e) => Console.WriteLine(notify.Checked);
bool on = notify.Checked;

RadioButton (переключатель)

var user = new RadioButton { Text = "Пользователь", Checked = true, AutoSize = true };
var admin = new RadioButton { Text = "Админ", AutoSize = true };
var panelRoles = new FlowLayoutPanel { FlowDirection = FlowDirection.TopDown };
panelRoles.Controls.AddRange(new Control[] { user, admin });

ComboBox (выпадающий список)

var combo = new ComboBox
{
DropDownStyle = ComboBoxStyle.DropDownList,
Width = 180
};
combo.Items.AddRange(new object[] { "Работа", "Личное", "Учёба" });
combo.SelectedIndex = 0;
string choice = combo.SelectedItem?.ToString() ?? "";
table.Controls.Add(combo, 1, 1);

ListBox (список)

var list = new ListBox { Height = 120, Dock = DockStyle.Fill };
list.Items.AddRange(new object[] { "Яблоко", "Груша", "Слива" });
list.SelectedIndexChanged += (s, e) =>
{
if (list.SelectedItem is string item) Console.WriteLine(item);
};
panel.Controls.Add(list);

DataGrid (DataGridView)

var grid = new DataGridView
{
Dock = DockStyle.Fill,
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,
ReadOnly = true,
AllowUserToAddRows = false
};
grid.Columns.Add("name", "Имя");
grid.Columns.Add("age", "Возраст");
grid.Rows.Add("Алиса", 30);
panel.Controls.Add(grid);

С BindingSource / списком объектов — привязка DataSource.


ProgressBar (индикатор прогресса)

var progress = new ProgressBar
{
Minimum = 0,
Maximum = 100,
Value = 0,
Style = ProgressBarStyle.Continuous,
Width = 240
};
progress.Value = 50;

var marquee = new ProgressBar { Style = ProgressBarStyle.Marquee, MarqueeAnimationSpeed = 30 };

TrackBar (ползунок)

var track = new TrackBar
{
Minimum = 0,
Maximum = 100,
Value = 50,
TickFrequency = 10,
Width = 240
};
track.ValueChanged += (s, e) => label.Text = track.Value.ToString();

Поле поиска (фильтр ListBox)

var search = new TextBox { PlaceholderText = "Поиск…" };
search.TextChanged += (s, e) =>
{
list.Items.Clear();
foreach (var item in allItems)
if (item.Contains(search.Text, StringComparison.OrdinalIgnoreCase))
list.Items.Add(item);
};

TabControl (вкладки)

var tabs = new TabControl { Dock = DockStyle.Fill };
var tabGeneral = new TabPage("Общее");
tabGeneral.Controls.Add(new Label { Text = "Содержимое", Dock = DockStyle.Fill });
var tabSettings = new TabPage("Настройки");
tabs.TabPages.Add(tabGeneral);
tabs.TabPages.Add(tabSettings);
form.Controls.Add(tabs);

var menu = new MenuStrip();
var file = new ToolStripMenuItem("Файл");
file.DropDownItems.Add("Открыть", null, (s, e) => OpenFile());
file.DropDownItems.Add(new ToolStripSeparator());
file.DropDownItems.Add("Выход", null, (s, e) => form.Close());
menu.Items.Add(file);
form.MainMenuStrip = menu;
form.Controls.Add(menu);

ToolStrip (панель инструментов)

var tool = new ToolStrip();
tool.Items.Add(new ToolStripButton("Новый", null, (s, e) => NewDoc()));
tool.Items.Add(new ToolStripButton("Сохранить", null, (s, e) => SaveDoc()));
form.Controls.Add(tool);

StatusStrip (строка состояния)

var status = new StatusStrip();
var label = new ToolStripStatusLabel("Готово") { Spring = true, TextAlign = ContentAlignment.MiddleLeft };
status.Items.Add(label);
form.Controls.Add(status);
label.Text = "Сохранено";

Прокрутка (Panel + AutoScroll)

var scroll = new Panel
{
Dock = DockStyle.Fill,
AutoScroll = true
};
scroll.Controls.Add(tallContent);
form.Controls.Add(scroll);

Для TextBox/ListBox — встроенные ScrollBars.


Диалоги

MessageBox.Show("Готово", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
var ok = MessageBox.Show("Удалить?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes;

using var ofd = new OpenFileDialog { Filter = "Текст|*.txt|Все|*.*" };
if (ofd.ShowDialog() == DialogResult.OK) { var path = ofd.FileName; }

using var sfd = new SaveFileDialog { DefaultExt = "txt" };
if (sfd.ShowDialog() == DialogResult.OK) { /* сохранить */ }

using var fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK) { var dir = fbd.SelectedPath; }

ToolTip (подсказка)

var tips = new ToolTip();
tips.SetToolTip(saveButton, "Сохранить документ на диск");
tips.ShowAlways = true;

ContextMenuStrip (контекстное меню)

var menu = new ContextMenuStrip();
menu.Items.Add("Копировать", null, (s, e) => Copy());
menu.Items.Add("Вставить", null, (s, e) => Paste());
listBox.ContextMenuStrip = menu;

Дочерняя форма (модальная)

using var dialog = new Form
{
Text = "Настройки",
ClientSize = new Size(320, 200),
FormBorderStyle = FormBorderStyle.FixedDialog,
StartPosition = FormStartPosition.CenterParent,
MaximizeBox = false,
MinimizeBox = false
};
dialog.ShowDialog(ownerForm);

Фоновая работа без блокировки UI

await Task.Run(() => LongWork());
label.Text = "Готово"; // после await — уже в UI-потоке

// или
button.Invoke(() => button.Enabled = false);

Частые ошибки

СимптомПричина
Контрол не виденНет Controls.Add, нулевой Size, перекрыт Dock
UI зависаетДолгий код в обработчике Click
Cross-threadОбновление контрола не через Invoke
Форма не закрывает процессНет Application.Exit / висящие потоки

См. также


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").