我想在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
,列表框项目将再次出现,但工具提示将停止工作。那里发生了什么事?
答案 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个字符,而要执行任何过滤操作。