2

编辑: 这不是TabControl C# 中的图标的副本 - 如何?. 那里的问题是关于向标签页添加图标。这里是关于如何将错误提供程序错误图标位置更改为标题内而不是标签页本身的右侧。此外,错误提供程序错误图标具有以下功能,当您将鼠标悬停在其上时,您会看到错误文本,如果您只是将图标添加到标题中,您不会看到错误文本。


我有一个带有TabControl. 该表格还有一个ErrorProvider. 当我尝试使用以下代码时:

errorProvider1.SetError(tabPage1, "error");

错误图标显示在选项卡页面的右侧,并被选项卡控件本身截断: 1]

我希望该图标显示在标签页标题旁边。像这样的东西(用Photoshop制作):

2]

我不知道从哪里开始,或者如何解决这个问题。

编辑: 我有一个类负责向控件添加错误,并使用错误提供程序显示它们。此类用于TextBoxes、NumericUpDowns 等。我也想将其用于TabPages. 问题是当我将它用于标签页时,我得到了上面显示的结果。使用 an 添加错误图标到标题ImageList然后添加工具提示的技巧并不好,因为它特定于标签页,我无法在我的类中实现它,这对所有控件都是通用的。所以我真的需要改变标签页的设置,所以当我使用errorProvider.SetError(...)它时,它会显示在标题中。

4

2 回答 2

8

ErrorProvider显示TabPage标签页客户区的错误图标。通过玩IconAlignmentIconPadding,您可以TabControl在其中一个标签页的标题上显示错误图标,但它是整个错误图标TabControl

在实际应用程序中,每个选项卡页都可以包含无效的控件,您可能希望在选项卡页上显示验证图标,而不是针对选项卡控件。

我的建议是通过设置ImageList包含错误图标作为图像列表TabControl并通过设置显示或隐藏图像图标来使用标签页图标ImageIndexTabPage这样,您可以为每个需要它的标签页显示错误图标:

在此处输入图像描述

例子

要设置示例,请执行以下步骤:

  1. 创建一个Form.
  2. 将 a TabControl、 anErrorProvider和 anImageList放在 上Form
  3. ImageList属性设置tabControl1imageList1
  4. 放两个TextBoxtabPage1
  5. 例如,我假设您将使用Validating事件验证这两个文本框控件。关键点在这里。当您验证任何控件时,请检查它是否托管在 a 中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;
    }
    
于 2019-01-15T18:27:07.097 回答
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 文本前添加空格,以确保有足够的空间来显示图标

在此处输入图像描述

在第二个选项卡上有图标

在此处输入图像描述

于 2019-01-15T10:53:01.723 回答