当前位置:  开发笔记 > 编程语言 > 正文

组合框中每个项目的工具提示

如何解决《组合框中每个项目的工具提示》经验,为你挑选了2个好方法。

我只想为组合框中的每个项添加工具提示.我正在使用c#.net windows应用程序.

没有选择

combobox.items [1] .tooltip();

有没有办法添加工具提示呢?



1> Michael Sore..:

这个问题实际上有几个合理的解决方案.MSDN论坛有一个ComboBox项目突出显示事件帖子,其中包含两种可能性,一种来自nobugz,另一种来自agrobler.它们中的每一个都提供了一个代码,用于子类化ComboBox,该ComboBox应该处理ComboBox下拉列表中各个项目的工具提示.Agrobler的解决方案看起来更加精致,因为他/她甚至包含了一些不错的插图,但不幸的是,至少对我来说,如何填充控件的关键ToolTipMember属性并不清楚.

这两种解决方案似乎都允许分配给各个项目的任意工具提示.更具体但更常见的情况是,当您知道可能有太长的项目无法适应ComboBox的宽度时,您只需要工具提示镜像项目的文本.在我自己的情况下,我有一个ComboBox的实例,它包含完整的文件路径,因此很容易看到内容可能超出ComboBox的宽度.

叶志新在MSDN论坛发布的Windows Dropdown问题中提供了解决这个更具体问题的解决方案,并且更加简单.我在这里完整地重现了代码.(请注意,此代码预先假定您已创建一个名为Form1的Form并连接显示的加载处理程序,并且还添加了一个名为comboBox1的ComboBox和一个工具提示处理程序toolTip1.)

private void Form1_Load(object sender, EventArgs e)
{
    this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
    this.comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
}

void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    string text = this.comboBox1.GetItemText(comboBox1.Items[e.Index]);
    e.DrawBackground();
    using (SolidBrush br = new SolidBrush(e.ForeColor))
    { e.Graphics.DrawString(text, e.Font, br, e.Bounds); }

    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
    { this.toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
    else { this.toolTip1.Hide(comboBox1); }
    e.DrawFocusRectangle();
}

虽然简单明了,这个代码就从一个故障影响(如指出了上述MSDN线程的答复):当你移动鼠标(不点击)从一个下拉列表项到下一个,只有每一个其他一个显示持久的工具提示!修复只是通过该线程上的另一个条目暗示,所以我认为在这里提供完整的,更正的代码是有用的:

private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
    comboBox1.DrawItem += comboBox1_DrawItem;
    comboBox1.DropDownClosed += comboBox1_DropDownClosed;
}

private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
    toolTip1.Hide(comboBox1);
}

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) { return; } // added this line thanks to Andrew's comment
    string text = comboBox1.GetItemText(comboBox1.Items[e.Index]);
    e.DrawBackground();
    using (SolidBrush br = new SolidBrush(e.ForeColor))
    { e.Graphics.DrawString(text, e.Font, br, e.Bounds); }
    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
    { toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
    e.DrawFocusRectangle();
}

除了删除一些冗余的代码部分(例如"this"限定符)之外,主要区别在于将toolTip1.Hide调用移动到DropDownClosed事件处理程序中.从DrawItem处理程序中取出它可以消除上面提到的缺陷; 但是当你下拉关闭时你需要关闭它,否则最后显示的工具提示将保留在屏幕上.

2012.07.31附录

只是想提一下,我已经创建了一个包含这个工具提示功能的复合ComboBox,所以如果你使用我的库,你根本就没有代码可以编写.只需将ComboBoxWithTooltip拖到Visual Studio设计器上即可完成.在我的API页面上深入查看ComboBoxWithTooltip 或下载我的开源C#库以开始使用.(请注意,Andrew捕获的bug的补丁将在1.1.04版本中发布,即将发布.)


只是一个警告...如果您将`DropDownStyle`设置为`DropDownList`,这实际上不起作用.如果使用`DropDownList`,则需要确保`e.Index`大于-1.

2> 小智..:
private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
    ToolTip toolTip1 = new ToolTip();
    toolTip1.AutoPopDelay = 0;
    toolTip1.InitialDelay = 0;
    toolTip1.ReshowDelay = 0;
    toolTip1.ShowAlways = true;
    toolTip1.SetToolTip(this.comboBox1, comboBox1.Items[comboBox1.SelectedIndex].ToString()) ;
}


虽然这样可以工作,但它也会在工具提示之间创建一个强大的连接(您现在无法将其创建为您创建它而不将其分配给变量).所以如果你试图删除到comboBox.虽然它会从视线中移除.它将留在记忆中.不仅如此,每次更改索引时,您都会使用新的工具提示复合关系.我将Tooltip带到更高的范围,并简单地调用如下:private void comboBox1_SelectedIndexChanged(object sender,System.EventArgs e){myGolbalToolTip.SetToolTip(this.comboBox1,yourString);
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有