注意:ここで紹介している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の代わりに使用してください。
注意:新しく作成したクラスを、基のコントロールクラスの代わりに使用するという意味が分からないという方は、こちらをご覧ください。
''' <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
/// <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プログラミング研究 第54号」で紹介したものを基にしています。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。