DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridの列の幅をユーザーが変更できないようにする

注意:ここで紹介しているDataGridは、System.Windows.Forms名前空間のDataGrid(Windowsフォーム)です。System.Web.UI.WebControls名前空間のDataGrid(Webフォーム)ではありません。

これに関しては、「Windows Forms FAQ - How can I prevent my user from sizing columns in my datagrid?」が参考になります。この記事で紹介されている方法は、DataGridクラスの派生クラスを作成し、OnMouseMoveとOnMouseDownメソッドをオーバーライドし、マウスが列ヘッダの境界線上にあるときは何もしないようにするというものです。

この方法によるサンプルを以下に示します。このDataGridExクラスをSystem.Windows.Forms.DataGridの代わりに使用してください。

注意:新しく作成したクラスを、基のコントロールクラスの代わりに使用するという意味が分からないという方は、こちらをご覧ください。
VB.NET
コードを隠すコードを選択
''' <summary>
''' 列ヘッダの幅をユーザーが変更することができないDataGrid
''' </summary>
Public Class DataGridEx
    Inherits System.Windows.Forms.DataGrid

    Protected Overrides Sub OnMouseMove( _
        ByVal e As System.Windows.Forms.MouseEventArgs)
        '列ヘッダの境界線上にマウスがあるときは何もしない
        Dim hti As System.Windows.Forms.DataGrid.HitTestInfo = _
            Me.HitTest(New System.Drawing.Point(e.X, e.Y))
        If hti.Type = _
            System.Windows.Forms.DataGrid.HitTestType.ColumnResize Then
            Return
        End If

        MyBase.OnMouseMove(e)
    End Sub

    Protected Overrides Sub OnMouseDown( _
        ByVal e As System.Windows.Forms.MouseEventArgs)
        '列ヘッダの境界線上にマウスがあるときは何もしない
        Dim hti As System.Windows.Forms.DataGrid.HitTestInfo = _
            Me.HitTest(New System.Drawing.Point(e.X, e.Y))
        If hti.Type = _
            System.Windows.Forms.DataGrid.HitTestType.ColumnResize Then
            Return
        End If

        MyBase.OnMouseDown(e)
    End Sub
End Class
C#
コードを隠すコードを選択
/// <summary>
/// 列ヘッダの幅をユーザーが変更することができないDataGrid
/// </summary>
public class DataGridEx : System.Windows.Forms.DataGrid
{
    protected override void OnMouseMove(
        System.Windows.Forms.MouseEventArgs e)
    {
        //列ヘッダの境界線上にマウスがあるときは何もしない
        System.Windows.Forms.DataGrid.HitTestInfo hti =
            this.HitTest(new System.Drawing.Point(e.X, e.Y));
        if(hti.Type ==
            System.Windows.Forms.DataGrid.HitTestType.ColumnResize)
        {
            return;
        }

        base.OnMouseMove(e);
    }

    protected override void OnMouseDown(
        System.Windows.Forms.MouseEventArgs e)
    {
        //列ヘッダの境界線上にマウスがあるときは何もしない
        System.Windows.Forms.DataGrid.HitTestInfo hti =
            this.HitTest(new System.Drawing.Point(e.X, e.Y));
        if(hti.Type ==
            System.Windows.Forms.DataGrid.HitTestType.ColumnResize)
        {
            return;
        }

        base.OnMouseDown(e);
    }
}

また、掲示板では、列の幅が変更された時に列の幅を元に戻すという方法が紹介されています。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。