■ DataGridViewのイベント
CellDoubleClick
* セルのダブルクリックイベント使用上の注意
* ヘッダーをダブルクリックした時も呼ばれる【対応方法】
* 「e.RowIndex < 0」で判断する【対応例】
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0)
{
// ヘッダーをダブルクリックしたら特に何もしない
return;
}
// ここから実装する
var dataGridView = sender as DataGridView;
MessageBox.Show(dataGridView[e.ColumnIndex, e.RowIndex].Value.ToString());
}
参考文献 http://heppoen.seesaa.net/article/435645261.html
CellContextMenuStripNeeded
* セルの右クリック押下時に発生 * サンプルは、以下の記事「DataGridView に右クリックを適用する」を参照のことhttp://blogs.yahoo.co.jp/dk521123/30488275.html
■ サンプル
例1:CellFormattingイベントで値によって表示を変える
* CellFormattingイベントで値によって表示を変える => これを使えば、列挙型の値も表示で変更できる * 以下のサイトを参考。https://dobon.net/vb/dotnet/datagridview/cellformattingvalue.html
* 事前に DataGridView に 項目として Id/PersonName/Ageを追加しておくForm1.cs
using System; using System.Windows.Forms; namespace SampleForm { public partial class Form2 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.dataGridView1.Rows.Add(1L, "Mike", 26); this.dataGridView1.Rows.Add(2L, "Tom", 41); this.dataGridView1.Rows.Add(3L, "Smith", 29); this.dataGridView1.Rows.Add(4L, "Naomi", 38); this.dataGridView1.Rows.Add(5L, "Kevin", 24); } private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { DataGridView dataGridView = (DataGridView)sender; // セルの列を確認 if (dataGridView.Columns[e.ColumnIndex].Name == "Age" && e.Value is int) { var value = Convert.ToInt32(e.Value); if (value <= 27) { e.Value = "若手"; } else if (value >= 28 && value <= 39) { e.Value = "中堅"; } else { e.Value = "シニア"; } // フォーマットの必要がないことを知らせる e.FormattingApplied = true; } } } }
例2
* 入力した値がDataTime型なら、CellParsingイベントにより、「yyyy/MM/dd」に変換する * 表示時に、値がDataTime型なら、CellFormattingイベントで、年齢に変換する って、ゆークラス・ExtendDataGridViewを作成ExtendDataGridView.cs
public class ExtendDataGridView
{
private readonly string columnName;
private ExtendDataGridView(DataGridView dataGridView, string columnName)
{
this.columnName = columnName;
dataGridView.CellParsing += CellParsing;
dataGridView.CellFormatting += CellFormatting;
}
public static void Attach(DataGridView dataGridView, string columnName)
{
new ExtendDataGridView(dataGridView, columnName);
}
private void CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
DataGridView dataGridView = sender as DataGridView;
if (dataGridView == null)
{
return;
}
int columnIndex = e.ColumnIndex;
if (dataGridView.Columns[columnIndex].Name == this.columnName &&
e.Value != null &&
e.DesiredType == typeof(string))
{
var birthDay = e.Value.ToString();
DateTime birthDate;
if (!DateTime.TryParse(birthDay, out birthDate))
{
return;
}
e.Value = birthDate.ToString("yyyy/MM/dd");
e.ParsingApplied = true; // 解析が不要であることを通知
}
}
private void CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
DataGridView dataGridView = sender as DataGridView;
if (dataGridView == null)
{
return;
}
if (dataGridView.Columns[e.ColumnIndex].Name == this.columnName &&
e.Value != null &&
e.DesiredType == typeof(string))
{
var birthDay = e.Value.ToString();
DateTime birthDate;
if (!DateTime.TryParse(birthDay, out birthDate))
{
return;
}
double totalDays = DateTime.Now.Subtract(birthDate).TotalDays;
int age = (int)(totalDays / 365);
e.Value = age.ToString();
e.FormattingApplied = true; //フォーマットの必要がないことを知らせる
}
}
}
Form1.cs public partial class Form1 : Form
{
public NUnitSampleForm()
{
InitializeComponent();
ExtendDataGridView.Attach(this.dataGridView1, "Column2");
}
}
参考文献
http://dobon.net/vb/dotnet/datagridview/cellparsing.htmlhttp://dobon.net/vb/dotnet/datagridview/cellformattingvalue.html
http://d.hatena.ne.jp/gsf_zero1/20080712/p1
関連記事
Windows Form ~ 目次 ~
https://blogs.yahoo.co.jp/dk521123/8054245.htmlDataGridView
DataGridView ~ プロパティ編 ~https://blogs.yahoo.co.jp/dk521123/14718079.html
DataGridView ~イベント編 ~
https://blogs.yahoo.co.jp/dk521123/23687833.html
DataGridView ~ ソート編 ~
https://blogs.yahoo.co.jp/dk521123/37914797.html
DataGridView を Label のように扱う
https://blogs.yahoo.co.jp/dk521123/29362064.html
DataGridView に ACCESS のデータを表示させる
https://blogs.yahoo.co.jp/dk521123/32859068.html
DataGridView に右クリックを適用する
https://blogs.yahoo.co.jp/dk521123/30488275.html