|
分類:[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);
}
}
}
|