5

スタックトレースを表示する.NETListViewコントロールがあります。特定の行のフォント/色を操作する必要があるため、ListViewを使用しました。

ただし、表示される文字数または列のピクセル数のいずれかで、列の幅に関して何らかの最大値があるようです。

問題を示す簡単なLINQPadの例を次に示します。

void Main()
{
    using (var fm = new Form())
    {
        ListView lv = new ListView();
        fm.Controls.Add(lv);
        lv.Dock = DockStyle.Fill;
        lv.View = View.Details;
        lv.Columns.Add("C", -1, HorizontalAlignment.Left);

        string line = new string('W', 258) + "x";
        lv.Items.Add(line);
        line = new string('W', 259) + "x";
        lv.Items.Add(line);

        lv.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent);
        lv.Columns[0].Width.Dump();

        fm.ShowDialog();
    }
}

スクリーンショット:

リストビューの問題のスクリーンショット

ご覧のとおり、258個のW + a Xを含む行はxを示していますが、1つの追加のWを含む次の行はxを示していません。

そこでの幅計算の出力は、列の現在の幅が2864ピクセルであることを示しています。

質問はこれです:この制限を回避するためにListViewで微調整できるものはありますか?

4

1 に答える 1

9

この動作は、次のMSDNページにListViewItem記載されています。

ListViewItemのテキストは259文字を超えてはなりません。超えない場合、予期しない動作が発生する可能性があります。

Microsoftの従業員によると

リストビュー項目のテキストの長さが259文字に制限されているのは、リストビューがファイルなどのオブジェクトの表示コレクション用に設計されており、汎用制御用ではないためです。したがって、これはWindowsファイルシステムのMAX_PATHのファイル名の長さの制限に似ています。

これに関するMicrosoftサポートの記事もあります。ListViewItem全文を保存します。長さが制限されているのはディスプレイだけです。


ただしListView、カスタムを作成して次のように設定すると、全文を表示できるように見えますOwnerDraw

public class MyListView : ListView
{
    public MyListView()
    {
        OwnerDraw = true;
        DrawItem += new DrawListViewItemEventHandler(MyListView_DrawItem);
    }

    private void MyListView_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
        e.Graphics.DrawString(e.Item.Text, e.Item.Font, 
                                    new SolidBrush(e.Item.ForeColor), e.Bounds);
    }
}

これにより、各の全文が表示されますListViewItem。これを行うことの欠点は、元の描画コードに何らかの方法でルーティングできない限り、他の視覚的な状態(たとえば、選択された状態、フォーカス状態など)もカスタム描画する必要があることです。

これを行うことに他の副作用があるかどうかはわかりません。

于 2011-04-05T23:51:51.900 に答える