【问题标题】:Refresh doesn't update owner-draw ListBox item height刷新不会更新所有者绘制的 ListBox 项目高度
【发布时间】:2014-03-17 21:28:12
【问题描述】:

我有ListBoxDrawMode = 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

还是我错过了一些方法(尝试过InvalidateUpdate)?

【问题讨论】:

  • @LarsTech,一个月前你去哪儿了? =D 顺便说一句,到目前为止,重新分配 DataSource 的“解决方案”效果出奇的好(它不会闪烁太多)。由于某些原因,ListBox 能够维持 SelectedIndex(或 SelectedItem),但 不能 SelectedItems(带有 SelectionMode=MiltiExtended),所以我可能会回到您的解决方案(带有子类化列表框重新创建句柄)有一天。谢谢。

标签: c# winforms listbox ownerdrawn


【解决方案1】:

对我来说,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 用作显示信息的控件,而不是存储它们,所以我只是制作了没有任何额外变量的循环。

【讨论】:

  • 重新分配DataSource 做同样的事情(清除ListBox 项目并将它们重新分配),但开销更少(不需要tmp)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
相关资源
最近更新 更多