我ListBox
DrawMode = OwnerDrawVariable
。当我动态改变一个(或多个)项目的高度并执行
listBox1.Refresh();
然后忽略新项高度,它只会正确重绘:
Ok
- 最初展开项目Not ok
- 通过鼠标展开。
衡量项目代码并不复杂,我最后检查了断点e.ItemHeight = 90
,但项目的高度仍为20
。
private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
// ... get item
e.ItemHeight = 20;
if(!collapsed)
e.ItemHeight = 20 + 10 * n; // n - number of child rows
}
问题:可行吗(有效)
listBox1.DataSource = null;
listBox1.DataSource = list; // list of my items
还是我错过了一些方法(尝试Invalidate
和Update
)?
答案 0 :(得分:0)
对我来说,只有当我删除了所有项目并再次添加它们时,OnMeasureItem事件才有效。我不能在C#中工作,所以代码在delphi中,但它应该运行得很好。
var
tmp: TStrings;
I: Integer;
begin
tmp := TStrings.Create();
try
for I := 0 to ListBox1.Items.Count - 1 do
tmp.Add(ListBox1.Items[I]);
ListBox1.Items.Clear;
for I := 0 to ListBox1.Items.Count - 1 do
ListBox1.Items.Add(tmp[I]);
finally
tmp.Free;
end;
end;
它对我有用,因为我只使用TListBox作为DISPLAY信息的控件,而不是存储它们所以我只是制作了没有任何附加变量的循环。