如何在列表框中为可变数量的项目加粗?我已经看过像this one这样的解决方案,但它似乎只有在运行时确切知道哪些项应该是粗体才有用。这是我的具体案例:
我有一个列表框,其中包含从文件中读取的字符串列表。我有一个搜索栏,当输入时,会自动将匹配该字符串的项目移动到列表框的顶部。不幸的是,在顶部并不足以指示搜索结果,"所以我也希望这些项目大胆。在运行之前,我知道我想要变为粗体的所有项目都将位于列表的顶部,但我不知道将会有多少项目。此外,当用户删除搜索栏的内容时,列表将重新排序为其初始顺序,粗体项目不应为粗体。
如何在运行时针对特定列表框项目以粗体/非粗体来回?
以下是我的搜索和显示功能代码:
private void txtSearch_TextChanged(object sender, EventArgs e)
{
string searchTerm = txtSearch.Text.Trim();
if(searchTerm.Trim() == "") // If the search box is blank, just repopulate the list box with everything
{
listBoxAllTags.DataSource = fullTagList;
return;
}
searchedTagList = new List<UmfTag>();
foreach(UmfTag tag in fullTagList)
{
if(tag.ToString().ToLower().Contains(searchTerm.ToLower()))
{
searchedTagList.Add(tag);
}
}
// Reorder the list box to put the searched tags on top. To do this, we'll create two lists:
// one with the searched for tags and one without. Then we'll add the two lists together.
List<UmfTag> tempList = new List<UmfTag>(searchedTagList);
tempList.AddRange(fullTagList.Except(searchedTagList));
listBoxAllTags.DataSource = new List<UmfTag>(tempList);
}
答案 0 :(得分:1)
我能够解决自己的问题。我确实使用了this question中的解决方案,但我改变了它:
private void listBoxAllTags_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
FontStyle fontStyle = FontStyle.Regular;
if(e.Index < searchedTagList.Count)
{
fontStyle = FontStyle.Bold;
}
if(listBoxAllTags.Items.Count > 0) // Without this, I receive errors
{
e.Graphics.DrawString(listBoxAllTags.Items[e.Index].ToString(), new Font("Arial", 8, fontStyle), Brushes.Black, e.Bounds);
}
e.DrawFocusRectangle();
}
需要第二个if语句(检查计数是否大于0)。没有它,我收到了#34; index [-1]&#34;错误,因为我的程序首先以空列表框开始,而DrawString方法无法为空listBox.Items []数组绘制字符串。