3

How can i remove sorting glyph from column headers in DataGridView without removing its sorting functionality.

I am working on windows form application in C#, i want to generate report from a datagridview, where datagridview column width will assign in report column, where as the DataGridView column include the with of sorting glyph, that is unnecessary space in my case, i want to exclude it from ColumnHeader.

4

3 に答える 3

4

これは、カスタム セル ペインティングを使用して実際に行うのは非常に簡単です。

あなたがする必要があるのは、DataGridView CellPaintingイベントを処理することだけです:

dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);

そして、ハンドラーで次のようにします。

void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex == -1)
    {
        e.Paint(e.CellBounds, DataGridViewPaintParts.All &~DataGridViewPaintParts.ContentBackground);

        e.Handled = true;
    }
}

上記のコードは非常に単純です。現在のセルがヘッダー行 (インデックスが -1) にあるかどうかを確認し、ContentBackground.

Windows 7 マシンでのみこれを確認しましたが、問題ないように見えます。コンテンツの背景はソート グリフにのみ使用されているようです。実行する必要がないことを確認するために、ターゲット環境でテストすることをお勧めします。グリフなしで ContentBackground を保持するためのカスタム ペイントが必要になりました。


ヘッダー セルの幅には、グリフのスペースが含まれます。これを変更すると少し面倒になるので、一般的には受け入れますが、幅をテキストに合わせる必要がある場合は、次のようなものが機能します。

DataBindingComplete最初に次の場合に幅を設定しDataGridViewます。

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{        
    if (dataGridView1.AutoSizeColumnsMode == DataGridViewAutoSizeColumnsMode.AllCells)
    {
        // Loop over all the columns
        foreach (DataGridViewColumn c in dataGridView1.Columns)
        {
            // Work out the size of the header text
            Size s = TextRenderer.MeasureText(c.HeaderText, dataGridView1.Font);

            // Change the autosize mode to allow us to see if the header cell has the 
            // longest text
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
            if (s.Width + 10 > c.Width)
            {
                // If the header cell is longest we set the column width
                c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                c.Width = s.Width + 10;
            }
            else
            {
                // If the header cell is not longest, reset the autosize mode
                c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
            }
        }
    }
}

それが完了したら、セル テキストがヘッダーよりも長い場合でも、列の自動サイズ調整を許可する必要があります。

そのために私はCellValueChangedイベントを使用しました:

void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewColumn c = dataGridView1.Columns[e.ColumnIndex];

    if (c.AutoSizeMode == DataGridViewAutoSizeColumnMode.None)
    {
        Size s = TextRenderer.MeasureText(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(), dataGridView1.Font);
        if (s.Width > c.Width)
        {
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
        }
    }

}
于 2012-08-11T11:17:22.347 に答える
1

必要に応じてカスタム データ グリッド ビューを作成しない限り、WinForms でそれを行うことはできません。

アップデート

ボタンやキャンバス コントロールにカスタム プログレス バーを作成しましたが、カスタム データ グリッド ビューは作成しませんでした。そうは言っても、これを行う私の考えは次のとおりです...

基本的に、新しいUserControlを作成し、それに通常の DataGridView を追加して、ヘッダーを削除します。次に、列ヘッダーで「機能する」DataGridControl の上にパネルを追加します。ヘッダーをクリックして並べ替え、サイズを変更して列のサイズを変更し、DataGridView でメソッドを呼び出して同じことを行うなど、すべてのイベントを処理する必要があります。

ユーザーが下にスクロールしたときに列ヘッダーを非表示にする効果が必要な場合は、手動でも行う必要があります。

申し訳ありませんが、これより確実な出発点を示すことはできません。カスタム コントロールの作成に慣れていない場合は、カスタム ボタン (例: 左側に画像があるもの) またはプログレス バーを作成してみてください。プログレス バーの中央には進行状況のパーセンテージも表示されます。何ができるかを実感できます。

WPF を使っている人なら、このようなことは簡単に実現できると思います。

于 2012-08-11T06:11:16.087 に答える
0

右揃えのヘッダー テキストをセルのコンテンツに揃えようとすると、同じ問題が発生します (ヘッダー テキストも完全に右揃えされていない数字の行ではばかげているように見えます)。他の dgv で、グリフを絞り出します。

とにかく本当に簡単な解決策は、先頭のスペースでヘッダー テキストを入力し、ヘッダー セルのラップ モードを false に設定することです。例:

    dgv.Columns["Width"].HeaderText = "        Width";
    dgv["Width"].HeaderCell.Style.WrapMode = DataGridViewTriState.False;

先頭のスペースの数を正しく取得するには、少し試行錯誤する必要があるかもしれませんが、結果は満足のいくものです。(末尾のスペースで機能するかどうかはわかりません。夜遅くに試すには遅すぎます。)

于 2013-02-04T18:50:15.380 に答える