0

列のサイズを変更すると、更新された配置でデータが再描画されません。Invalidating、Refreshing、およびその他のいくつかのことを試しました。何も機能していません。誰かが回避策を知っていますか? Windows 用の mono でこれを試したことはありません。

私が何を意味するかを理解するには、このコントロールをフォームにドロップし、Linux の mono で実行します。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

class MyListView : ListView
{
  private readonly List<ListViewItem> items_ = new List<ListViewItem>();
  public MyListView()
  {
    VirtualMode = true;
    Columns.Add("Col 1");
    Columns.Add("Col 2");
    Columns.Add("Col 3");
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
    Add(new ListViewItem(new[] { "a", "b", "c" }));
  }
  protected override void OnRetrieveVirtualItem(RetrieveVirtualItemEventArgs e)
  {
    e.Item = items_[e.ItemIndex];
    base.OnRetrieveVirtualItem(e);
  }
  public void Add(ListViewItem item)
  {
    items_.Add(item);
    VirtualListSize = items_.Count;
  }
  protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
  {
    e.DrawText();
    base.OnDrawColumnHeader(e);
  }
  protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
  {
    var text = ((ListViewItem.ListViewSubItem)e.SubItem).Text;
    using (var brush = new SolidBrush(e.SubItem.ForeColor))
    {
      e.Graphics.DrawString(text, Font, brush, e.Bounds);
    }
    base.OnDrawSubItem(e);
  }
  protected override void OnColumnWidthChanged(ColumnWidthChangedEventArgs e)
  {
    base.OnColumnWidthChanged(e);
    Invalidate(true); // Nope, that didn't work
    Refresh(); // Nope, that didn't work
  }
}
4

1 に答える 1

1

私はそれを考え出した。ListViewItem インスタンスを格納して再利用する私の方法は Windows で問題なく動作しますが、mono は OnRetrieveVirtualItem の本体でそれらを再作成することを好みます。

于 2010-05-07T19:31:44.510 に答える