C# 如何在选项卡页标题旁边显示ErrorProvider错误图标?

C# 如何在选项卡页标题旁边显示ErrorProvider错误图标?,c#,winforms,tabcontrol,tabpage,errorprovider,C#,Winforms,Tabcontrol,Tabpage,Errorprovider,编辑: 这不是一个复制品。问题是如何将图标添加到选项卡页面。这里是关于如何将错误提供程序错误图标的位置更改为在标题内,而不是选项卡页面本身的右侧。此外,错误提供程序错误图标的功能是,当您将鼠标悬停在其上时,您会看到错误文本,如果您只是在标题中添加图标,则不会看到错误文本 我有一个带有TabControl的表单。表单还有一个ErrorProvider。当我尝试使用以下代码时: errorProvider1.SetError(tabPage1, "error"); 错误图标显示在选项卡页面的右侧

编辑: 这不是一个复制品。问题是如何将图标添加到选项卡页面。这里是关于如何将错误提供程序错误图标的位置更改为在标题内,而不是选项卡页面本身的右侧。此外,错误提供程序错误图标的功能是,当您将鼠标悬停在其上时,您会看到错误文本,如果您只是在标题中添加图标,则不会看到错误文本


我有一个带有
TabControl
的表单。表单还有一个
ErrorProvider
。当我尝试使用以下代码时:

errorProvider1.SetError(tabPage1, "error");
错误图标显示在选项卡页面的右侧,它被选项卡控件本身切断:

我希望图标显示在选项卡页面标题旁边。类似这样的东西(用Photoshop制作):

我不知道从哪里开始,也不知道如何处理这个问题

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

您可以执行以下操作

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文本前添加空格,以确保有足够的空间显示图标

在第二个选项卡上显示图标


ErrorProvider
在选项卡页面的客户端区域显示
选项卡页面
的错误图标。 通过玩
IconAlignment
iconadding
,您可以在一个选项卡页面的标题上显示
TabControl
的错误图标,但它是整个
TabControl
的错误图标

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

我的建议是通过将包含错误图标的
ImageList
设置为
TabControl
的图像列表,并通过设置
TabPage
ImageIndex
来使用选项卡页面图标,以显示或隐藏图像图标。通过这种方式,您可以为每个需要的选项卡页面显示错误图标:

示例

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

  • 创建一个
    表单
  • 选项卡控件
    错误提供程序
    图像列表
    放到
    表单
  • tabControl1
    ImageList
    属性设置为
    imageList1
  • 选项卡page1
    上放置两个
    文本框
  • 例如,我假设您将使用
    Validating
    事件验证这两个文本框控件。关键是这里。验证任何控件时,请检查它是否位于
    选项卡页
    中,检查
    选项卡页
    的所有子控件的有效性,并基于此设置错误图标:

    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;
    }
    
    protected override void OnLoad(事件参数e)
    {
    基础荷载(e);
    this.AutoValidate=AutoValidate.EnableAllowFocusChange;
    imageList1.ColorDepth=ColorDepth.Depth32位;
    imageList1.Images.Add(errorProvider1.Icon);
    tabControl1.ImageList=imageList1;
    textBox1.验证+=textBox\u验证;
    textBox2.验证+=textBox\u验证;
    }
    私有无效文本框\u正在验证(对象发送方,CancelEventArgs e)
    {
    var textBox=(textBox)发送方;
    if(string.IsNullOrEmpty(textBox.Text))
    {
    this.errorProvider1.SetError(文本框,“需要值”);
    e、 取消=真;
    }
    其他的
    this.errorProvider1.SetError(文本框,null);
    var tabPage=textBox.Parent作为tabPage;
    if(tabPage!=null)
    ValidateTabPage(选项卡页);
    }
    无效验证选项卡页(选项卡页选项卡页)
    {
    var tabIsValid=tabPage.Controls.Cast()
    .All(x=>string.IsNullOrEmpty(errorProvider1.GetError(x)));
    if(tabIsValid)
    tabPage.ImageIndex=-1;
    其他的
    tabPage.ImageIndex=0;
    }
    

  • @Reniuz可能重复-请查看我的编辑。您可以执行与链接答案相同的操作,还可以为选项卡页面添加工具提示-当您将鼠标悬停在选项卡页面标题上时,将显示工具提示。@Reniuz-谢谢。即便如此,这也不是重复。另外,请查看我的新编辑。
    ErrorProvider
    在更改图标位置时不够灵活,即使您更改了错误图标的位置,对于选项卡页面,它也会在选项卡页面的客户端区域显示图标。或者,如果您选择为选项卡控件设置错误图标,则在任何时间点,您只能为一个选项卡页显示错误图标,而所有选项卡页上可能都有无效控件。通常,如果我想显示标签页的错误图标,我会使用标签页的图标。我想说的是定制或通用,就像你考虑的那样:<代码> SETICONPUP 自定义或通用。谢谢!当所选选项卡是第一个选项卡时,这是我得到的结果:。但是,当选定的选项卡是第二个选项卡时,图标消失。@Sipo添加了一个包含上述场景的屏幕截图。你的意思是一样的吗?我的意思是,如果我使用
    tabControl1.GetTabRect(1)
    ,那么结果是:@Sipo我已经更新了答案。现在应该可以工作了,在设置图标添加时需要使用“-rc.Left”。请检查一下,让我知道你需要玩一点数字20(偏移量),我建议在你的TabPage文本前留一些空间,这样你就可以适应图标的使用