C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DataGridでcellを選択できないようにする方法


(過去ログ 87 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■51798 / inTopicNo.1)  DataGridでcellを選択できないようにする方法
  
□投稿者/ はっちゃん (5回)-(2010/07/19(Mon) 22:16:34)

分類:[C#] 

SQLServer2008とVisualStudio2008を使用してDataGrid(ReadOnly)にDataTableの値を表示するプログラム(Windowsアプリ)を作成しています。

現在はDataGridにDataTableの値を表示できていて、ReadOnlyの設定までできています。

Formを表示させるとDataGridのTextBoxが選択状態(BackColorがグレーになっている)になっていて
文字が青で反転表示されています。

Formを表示した時に、選択状態と反転表示をさせない方法はあるのでしょうか?

どなたか教えて下さい。


    public partial class frmTop : Form
    {
        DataGrid _dg = null;
        
    public frmTop()
        {
            InitializeComponent();

            SqlDataAdapter dAdp;
            DataSet ds = new DataSet(テーブル名);
            string strConn = 接続文字列;

            using (SqlConnection sc = new SqlConnection(strConn))
            {
                try
                {
                    dAdp = new SqlDataAdapter("SELECT 仕掛項目, 仕掛数, 完了数 FROM テーブル名", sc);
                    dAdp.Fill(ds, "テーブル名");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "通知");
                }
                finally
                {
                    if (sc.State != ConnectionState.Closed)
                    {
                        sc.Close();
                        sc.Dispose();
                    }
                }
            }

            _dg = new DataGrid();
            _dg.Location = new Point(100, 100);
            _dg.Size = new Size(506, 194);
            _dg.DataSource = ds.Tables[0];
            _dg.ReadOnly = true;
            _dg.Font = new Font("MS P ゴシック", 12);
            int RowCount = ds.Tables[0].Columns.Count;
            DataGridTableStyle ts = new DataGridTableStyle();
            ts.MappingName = ds.Tables[0].TableName;
            DataGridTextBoxColumn txtcs;
            DataGridLinkLabelColumn linkcs;
            for (int i = 0; i < RowCount; i++)
            {
                if (i == 0)
                {
                    txtcs = new DataGridTextBoxColumn();
                    txtcs.MappingName = ds.Tables[0].Columns[i].ColumnName;
                    txtcs.HeaderText = ds.Tables[0].Columns[i].ToString();
                    txtcs.Width = 300;
                    ts.GridColumnStyles.Add(txtcs);
                }
                else
                {
                    linkcs = new DataGridLinkLabelColumn();
                    linkcs.MappingName = ds.Tables[0].Columns[i].ColumnName;
                    linkcs.HeaderText = ds.Tables[0].Columns[i].ToString();
                    linkcs.Width = 100;
                    ts.GridColumnStyles.Add(linkcs);
                }
            }
            ts.AlternatingBackColor = Color.LightCyan;
            ts.RowHeadersVisible = false;
            ts.HeaderBackColor = Color.LightGreen;
            _dg.TableStyles.Add(ts);
            this.Controls.Add(_dg);
        }


【Class】
    /// <summary>
    /// DataGridにLinkLabelを表示するDataGridColumnStyle
    /// </summary>
    public class DataGridLinkLabelColumn : DataGridTextBoxColumn
    {
        Point _margin = new Point(1, 2);
        private System.Collections.ArrayList _visitedLinks;
        DataGrid _dataGrid;

        public DataGridLinkLabelColumn()
        {
            _visitedLinks = new System.Collections.ArrayList();
        }

        protected override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
        {

        }

        //Paintメソッドをオーバーライドする
        protected  override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
        {
            //表示する文字列を取得
            string text = GetColumnValueAtRow(source, rowNum).ToString();

            StringFormat sf = new StringFormat();
            
            //配置を指定する
            switch (this.Alignment)
            {
                case HorizontalAlignment.Left:
                    sf.Alignment = StringAlignment.Near;
                    break;

                case HorizontalAlignment.Center:
                    sf.Alignment = StringAlignment.Center;
                    break;

                case HorizontalAlignment.Right:
                    sf.Alignment = StringAlignment.Far;
                    break;
            }
            
            //テキストの方向を指定する
            if (alignToRight)
            {
                sf.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
            }

            //背景を塗りつぶす
            g.FillRectangle(backBrush, bounds);

            //前景色を決める
            Brush textBrush;
            if (_visitedLinks.Contains(text))
            {
                textBrush = Brushes.Purple;
            }
            else
            {
                textBrush = Brushes.Blue;
            }

            //フォントにアンダーラインをつける
            Font textFont = new Font(DataGridTableStyle.DataGrid.Font.FontFamily, DataGridTableStyle.DataGrid.Font.Size, DataGridTableStyle.DataGrid.Font.Style | FontStyle.Underline);
            RectangleF rectf = new RectangleF(bounds.X, bounds.Y, bounds.Width, bounds.Height);
            rectf.Inflate(-_margin.X, -_margin.Y);

            //文字列を描画する
            g.DrawString(text, textFont, textBrush, rectf, sf);
            sf.Dispose();
            textFont.Dispose();
        }

        protected override void SetDataGridInColumn(DataGrid value)
        {
            base.SetDataGridInColumn(value);
            if (!value.Equals(_dataGrid))
            {
                if (_dataGrid != null)
                {
                    _dataGrid.MouseMove -= new MouseEventHandler(DataGrid_MouseMove);
                    _dataGrid.MouseDown -= new MouseEventHandler(DataGrid_MouseDown);
                }
                value.MouseMove += new MouseEventHandler(DataGrid_MouseMove);
                value.MouseDown += new MouseEventHandler(DataGrid_MouseDown);
                _dataGrid = value;
            }
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            _dataGrid.MouseMove -= new MouseEventHandler(DataGrid_MouseMove);
            _dataGrid.MouseDown -= new MouseEventHandler(DataGrid_MouseDown);
        }

        private void DataGrid_MouseMove(object sender, MouseEventArgs e)
        {
            //マウスがセル上にあるときは、カーソルを変更する
            DataGrid.HitTestInfo hti = DataGridTableStyle.DataGrid.HitTest(e.X, e.Y);
            if (hti.Type == DataGrid.HitTestType.Cell && DataGridTableStyle.GridColumnStyles[hti.Column] is DataGridLinkLabelColumn)
            {
                DataGridTableStyle.DataGrid.Parent.Cursor = Cursors.Hand;
            }
            else
            {
                DataGridTableStyle.DataGrid.Parent.Cursor = Cursors.Default;
            }
        }

        private void DataGrid_MouseDown(object sender, MouseEventArgs e)
        {
            DataGrid grid = DataGridTableStyle.DataGrid;
            DataGrid.HitTestInfo info = grid.HitTest(e.X, e.Y);
            
            //マウスがセル上にあるか調べる
            if (info.Type == DataGrid.HitTestType.Cell && info.Column == DataGridTableStyle.GridColumnStyles.IndexOf(this))
            {
                //Process.Startを呼び出す
                CurrencyManager cm = (CurrencyManager) grid.BindingContext[grid.DataSource, grid.DataMember];
                string str = GetColumnValueAtRow(cm, info.Row).ToString();
                System.Diagnostics.Process.Start(str);
                
                //訪れたことを記憶する
                _visitedLinks.Add(str);
            }
        }
    }


引用返信 編集キー/
■51799 / inTopicNo.2)  Re[1]: DataGridでcellを選択できないようにする方法
□投稿者/ chobi (11回)-(2010/07/20(Tue) 08:25:35)
No51798 (はっちゃん さん) に返信
> SQLServer2008とVisualStudio2008を使用してDataGrid(ReadOnly)にDataTableの値を表示するプログラム(Windowsアプリ)を作成しています。
>
> 現在はDataGridにDataTableの値を表示できていて、ReadOnlyの設定までできています。
>
> Formを表示させるとDataGridのTextBoxが選択状態(BackColorがグレーになっている)になっていて
> 文字が青で反転表示されています。
>
> Formを表示した時に、選択状態と反転表示をさせない方法はあるのでしょうか?


Form.Shown時に
DataGrid.CurrentCell=null;
では駄目でしょうか?
http://www.atmarkit.co.jp/fdotnet/dotnettips/512dgvcurrent/dgvcurrent.html
引用返信 編集キー/
■51808 / inTopicNo.3)  Re[2]: DataGridでcellを選択できないようにする方法
□投稿者/ はっちゃん (6回)-(2010/07/20(Tue) 21:43:11)
No51799 (chobi さん) に返信
chobi さん、こんばんは。
下記の件、検証してみましたが、次のようなエラーが出ました。

【エラーメッセージ】

Null非許容の値型であるため、Nullを'System.Windows.Forms.DataGridCell'に変換できません。

また、下記のURLを見て検証してみましたが、DataGridViewでは【DataGridView.CurrentCell=null;】が動作するようです。


> Form.Shown時に
> DataGrid.CurrentCell=null;
> では駄目でしょうか?
> http://www.atmarkit.co.jp/fdotnet/dotnettips/512dgvcurrent/dgvcurrent.htm

.NetFrameWork3.5で開発を進めているのでDataGridの詳細な機能が使用できないということなのでしょうか?
.NetFrameWork2.0に変更する必要があるのでしょうか?

アドバイス、よろしくお願いします。
引用返信 編集キー/
■51811 / inTopicNo.4)  Re[3]: DataGridでcellを選択できないようにする方法
□投稿者/ chobi (12回)-(2010/07/21(Wed) 08:17:36)
No51808 (はっちゃん さん) に返信
> ■No51799 (chobi さん) に返信
> chobi さん、こんばんは。
> 下記の件、検証してみましたが、次のようなエラーが出ました。
>
> 【エラーメッセージ】
>
> Null非許容の値型であるため、Nullを'System.Windows.Forms.DataGridCell'に変換できません。
>
> また、下記のURLを見て検証してみましたが、DataGridViewでは【DataGridView.CurrentCell=null;】が動作するようです。
>
>
>>Form.Shown時に
>>DataGrid.CurrentCell=null;
>>では駄目でしょうか?
>>http://www.atmarkit.co.jp/fdotnet/dotnettips/512dgvcurrent/dgvcurrent.htm
>
> .NetFrameWork3.5で開発を進めているのでDataGridの詳細な機能が使用できないということなのでしょうか?
> .NetFrameWork2.0に変更する必要があるのでしょうか?
>
> アドバイス、よろしくお願いします。

おはようございます。
DataGridよりもDataGridViewの方が使いやすくないですか?
http://msdn.microsoft.com/ja-JP/library/ms171628.aspx
.NetFrameWorkは3.5のままでよいのではないでしょうか



引用返信 編集キー/
■51830 / inTopicNo.5)  Re[4]: DataGridでcellを選択できないようにする方法
□投稿者/ はっちゃん (7回)-(2010/07/21(Wed) 21:59:42)
No51811 (chobi さん) に返信

> おはようございます。
> DataGridよりもDataGridViewの方が使いやすくないですか?
> http://msdn.microsoft.com/ja-JP/library/ms171628.aspx
> .NetFrameWorkは3.5のままでよいのではないでしょうか

こんばんは、chobiさんの言うとおりDataGridViewの方が使いやすいですね。
仕事でDataGrid(VS2005)を使用しているので、勉強しようと思いDataGridを使ったのですが
VSのそれぞれのバージョンにある機能を勉強した方がいいですね。

DataGridViewで開発を進めます。

また何かわからないことがある時は、お世話になるかと思いますが
その時は、よろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -