Как показать значок ошибки ErrorProvider рядом с заголовком TabPage?

Редактировать: это не дубликат иконок в TabControl C# - как?, Вопрос в том, чтобы добавить значки на вкладки. Здесь речь идет о том, как изменить положение значка ошибки поставщика ошибок внутри заголовка, а не справа от самой вкладки. Кроме того, значок ошибки поставщика ошибок имеет такую ​​функцию, что при наведении на него мыши вы видите текст ошибки, который не отображается, если просто добавить значок в заголовок.


У меня есть форма с TabControl, Форма имеет также ErrorProvider, Когда я пытаюсь использовать следующий код:

errorProvider1.SetError(tabPage1, "error");

Значок ошибки отображается справа от вкладки и обрезается самим элементом управления вкладками:1

Я хотел бы, чтобы значок отображался рядом с заголовком вкладки. Примерно так (сделано с помощью Photoshop):

2

Я не знаю с чего начать или как к этому подойти.

Редактировать: у меня есть класс, отвечающий за добавление ошибок в элемент управления и их отображение с помощью поставщика ошибок. Этот класс используется для TextBoxэс, NumericUpDownS и т. д. Я хотел бы использовать его также для 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, показать или скрыть значок изображения. Таким образом, вы можете показать значок ошибки для каждой вкладки, которая нуждается в ней:

пример

Чтобы настроить пример, выполните следующие действия:

  1. Создать Form,
  2. Оставьте TabControl, ErrorProvider и ImageList на Form,
  3. Задавать ImageList собственностью tabControl1 в imageList1,
  4. Брось два TextBox на tabPage1,
  5. Я предполагаю, например, что вы собираетесь проверить эти два элемента управления текстового поля, используя 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;
    }
    
Другие вопросы по тегам