Как показать значок ошибки ErrorProvider рядом с заголовком TabPage?
Редактировать: это не дубликат иконок в TabControl C# - как?, Вопрос в том, чтобы добавить значки на вкладки. Здесь речь идет о том, как изменить положение значка ошибки поставщика ошибок внутри заголовка, а не справа от самой вкладки. Кроме того, значок ошибки поставщика ошибок имеет такую функцию, что при наведении на него мыши вы видите текст ошибки, который не отображается, если просто добавить значок в заголовок.
У меня есть форма с TabControl
, Форма имеет также ErrorProvider
, Когда я пытаюсь использовать следующий код:
errorProvider1.SetError(tabPage1, "error");
Значок ошибки отображается справа от вкладки и обрезается самим элементом управления вкладками:
Я хотел бы, чтобы значок отображался рядом с заголовком вкладки. Примерно так (сделано с помощью Photoshop):
Я не знаю с чего начать или как к этому подойти.
Редактировать: у меня есть класс, отвечающий за добавление ошибок в элемент управления и их отображение с помощью поставщика ошибок. Этот класс используется для TextBox
эс, NumericUpDown
S и т. д. Я хотел бы использовать его также для TabPages
, Проблема в том, что когда я использую его для вкладок, я получаю результат, показанный выше. Хитрость добавления значка ошибки в заголовок с помощью ImageList
а затем добавлять всплывающую подсказку нехорошо, поскольку она специфична для вкладок, и я не могу реализовать ее в своем классе, который является общим для всех элементов управления. Так что мне действительно нужно изменить настройки вкладки, поэтому, когда я использую errorProvider.SetError(...)
это показано в шапке.
2 ответа
Вы можете сделать следующее.
Rectangle rc = tabControl1.GetTabRect(0); // Replace with the index of Tab required
errorProvider1.SetIconPadding(tabControl1, -rc.Left-20);;
errorProvider1.SetError(tabControl1, "Error String");
Вам также нужно установить
errorProvider1.SetIconAlignment(tabControl1, ErrorIconAlignment.TopLeft);
Образец (с выбранной второй вкладкой - на основе комментариев),
Вам нужно будет добавить пробел к вашему тексту TabPage, чтобы обеспечить достаточно места для отображения значка
ht tps://stackru.com/images/37c2f4eb5523a6c4544176fcbd1b243e8fa69be1.png
Со значком на второй вкладке
ht tps://stackru.com/images/8516c29c924663a73e4ad81b60791c398e1836fa.png
ErrorProvider
показывает значок ошибки TabPage
в клиентской области вкладки. Играя с IconAlignment
или же IconPadding
Вы можете показать значок ошибки TabControl
на одном из заголовков вкладки, но это значок ошибки для всего TabControl
,
В реальном приложении каждая из вкладок может содержать недопустимые элементы управления, и вы можете захотеть показать значок проверки на страницах вкладок, а не для элемента управления вкладками.
Мое предложение использует значок вкладки, установив ImageList
содержащий значок ошибки в виде списка изображений TabControl
и установив ImageIndex
из TabPage
, показать или скрыть значок изображения. Таким образом, вы можете показать значок ошибки для каждой вкладки, которая нуждается в ней:
пример
Чтобы настроить пример, выполните следующие действия:
- Создать
Form
, - Оставьте
TabControl
,ErrorProvider
иImageList
наForm
, - Задавать
ImageList
собственностьюtabControl1
вimageList1
, - Брось два
TextBox
наtabPage1
, Я предполагаю, например, что вы собираетесь проверить эти два элемента управления текстового поля, используя
Validating
событие. Ключевой момент здесь. Когда вы проверяете любой элемент управления, проверьте, находится ли он вTabPage
, проверьте действительность всех детейTabPage
и установить значок ошибки на основе этого:protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.AutoValidate = AutoValidate.EnableAllowFocusChange; imageList1.ColorDepth = ColorDepth.Depth32Bit; imageList1.Images.Add(errorProvider1.Icon); tabControl1.ImageList = imageList1; textBox1.Validating += textBox_Validating; textBox2.Validating += textBox_Validating; } private void textBox_Validating(object sender, CancelEventArgs e) { var textBox = (TextBox)sender; if (string.IsNullOrEmpty(textBox.Text)) { this.errorProvider1.SetError(textBox, "Value is required."); e.Cancel = true; } else this.errorProvider1.SetError(textBox, null); var tabPage = textBox.Parent as TabPage; if (tabPage != null) ValidateTabPage(tabPage); } void ValidateTabPage(TabPage tabPage) { var tabIsValid = tabPage.Controls.Cast<Control>() .All(x => string.IsNullOrEmpty(errorProvider1.GetError(x))); if (tabIsValid) tabPage.ImageIndex = -1; else tabPage.ImageIndex = 0; }