在绘制项目悬停事件中显示工具提示

时间:2018-08-07 17:30:58

标签: c# winforms

我想在ListBox上显示工具提示,因此在加载表单中,我有:

        lstTech.DrawMode = DrawMode.OwnerDrawFixed;
        var techListQuery = $"exec getTaskAssignableEmployeeList";

           var techList = db.GetTableBySQL(techListQuery);


            lstTech.DataSource = techList.ToList();
            lstTech.DisplayMember = "Abbreviation";
            lstTech.ValueMember = "EmpGuid";

然后在DrawItem方法中我拥有

  private void lstTech_DrawItem(object sender, DrawItemEventArgs e)
        {
            ListBox senderListBox = (ListBox)sender;
            if (e.Index < 0)
            {
                return;
            }

            var item = ((DataRowView)senderListBox.Items[e.Index]);
            var abbr = senderListBox.GetItemText(item["Abbreviation"]);
            var name = senderListBox.GetItemText(item["Name"]);

            e.DrawBackground();

            using (SolidBrush br = new SolidBrush(e.ForeColor))
            {
                e.Graphics.DrawString(abbr, e.Font, br, e.Bounds);
            }

            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected )
            {
                ttTechs.Show(name, senderListBox, e.Bounds.Right, senderListBox.PointToClient(Cursor.Position).Y);
            }

            e.DrawFocusRectangle();
        }

然后我想在鼠标离开时消失工具提示,例如:

 private void lstTech_MouseLeave(object sender, EventArgs e)
        {
            ListBox senderListBox = (ListBox)sender;
            ttTechs.Hide(senderListBox);
        }

因此,现在Tooltip可以使用了,当我对列表中的某项进行clic时,它会出现,问题是我不希望它在clic上,我希望在Hover事件中使用它。所以我尝试:

  private void lstTech_MouseHover(object sender, EventArgs e)
        {
            ListBox senderListBox = (ListBox)sender;
            ttTechs.Show(senderListBox);
        }

但是它返回了一个错误:

  

方法'Show'的重载没有1个参数

我在做什么错?我需要在悬停事件上显示工具提示并从click事件中删除?问候

更新

作为下面的答案,我将代码更改为:

 //Set tooltip as Global variable
  ToolTip toolTip = new ToolTip();

  //Create new method to assign Draw
  private void SetToolTipText()
        {
            var content = string.Empty;
              foreach (DataRowView list in lstTech.SelectedItems)
               {
            var techName = list[1].ToString();
            content += techName + Environment.NewLine;
               }
            toolTip.SetToolTip(lstTech, content);
        }
          //Draw method
    private void lstTech_DrawItem(object sender, DrawItemEventArgs e)
        {
            SetToolTipText();
        }

问题是列表项不可见,如果我在列表框中单击,则工具提示会正确显示,但列表不会显示。如果我从lstTech.DrawMode = DrawMode.OwnerDrawVariable;中删除了load_form,列表框项目将再次出现,但工具提示将停止工作。那里发生了什么事?

1 个答案:

答案 0 :(得分:1)

ToolTip中有一个WinForms控件,您可以使用。

比方说,您的列表框包含一堆名称,而我只想在工具提示上显示每个名称的前3个字母。因此,我将编写一个函数来遍历列表框中的每个项目,过滤名称并创建一个字符串,然后将其设置为工具提示。

private void SetToolTipText()
{
    var content = string.Empty;
    foreach (var item in listBox1.Items)
    {
        var first3 = item.ToString().Substring(0, 3);
        content += first3 + Environment.NewLine;
    }
    toolTip.SetToolTip(listBox1, content);
}

请注意,toolTip是我的Form中的全局变量。

public partial class MainForm : Form
{
    ToolTip toolTip = new ToolTip();

    public MainForm()
    {
        InitializeComponent();
    }

接下来,我将在DrawItem()事件中调用该函数,如下所示:

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    SetToolTipText();
}

在您的程序中,不要执行字符串的前3个字符,而要执行任何过滤操作。