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

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


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

errorProvider1.SetError(tabPage1, "error");

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

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

2]

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

Edit: У меня есть класс, отвечающий за добавление ошибок в элемент управления и их отображение с помощью поставщика ошибок. Этот класс используется для TextBox es, NumericUpDown s и т. Д. Я хотел бы использовать его также для TabPages. Проблема в том, что когда я использую его для вкладок, я получаю результат, показанный выше. Уловка добавления значка ошибки в заголовок с использованием ImageList и последующего добавления всплывающей подсказки не годится, потому что она характерна для вкладок, и я не могу реализовать ее в своем классе, который является общим для всех элементов управления. Поэтому мне действительно нужно изменить настройки вкладки, чтобы при использовании errorProvider.SetError(...) оно отображалось в заголовке.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

ErrorProvider показывает значок ошибки TabPage в клиентской области вкладки. Играя с IconAlignment или IconPadding, вы можете отобразить значок ошибки TabControl на одном из заголовков вкладок, но это значок ошибки для всего TabControl.

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

Я предлагаю использовать значок страницы вкладки, установив ImageList, содержащий значок ошибки, в качестве списка изображений TabControl, и установив ImageIndex для TabPage, показать или скрыть значок изображения. Таким образом, вы можете показать значок ошибки для каждой вкладки, которая нуждается в этом:

enter image description here

* ** 1 022 тысяча двадцать-один * Пример

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

  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;
    }
    
0 голосов
/ 15 января 2019

Вы можете сделать следующее.

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, чтобы обеспечить достаточно места для отображения значка

enter image description here

со значком на второй вкладке

enter image description here

...