作成日: 2018/01/12 最終更新日: 2018/01/12
文書種別
制限事項
詳細
C1FlexGridをDataTableとバインドし、このデータテーブルの値を変更しても、CellChangedイベントが発生しません。
本件は仕様上の制限に当たります。
過去のバージョンでは、このタイミングでCellChangedイベントが発生している時代がありましたが、データソースの値変更時にCellChangedイベントを発生させた場合に懸念される下記問題を回避するため、仕様が変更されました。
【問題点】
1.変更に複数のセルが含まれる可能性があります。
2.変更がコミットされるまでイベントは発生しません。
3.このタイミングで発生した場合、DataGridViewと互換性がありません。
4.このタイミングで発生した場合、旧バージョンとの互換性がありません。
本件は仕様上の制限に当たります。
過去のバージョンでは、このタイミングでCellChangedイベントが発生している時代がありましたが、データソースの値変更時にCellChangedイベントを発生させた場合に懸念される下記問題を回避するため、仕様が変更されました。
【問題点】
1.変更に複数のセルが含まれる可能性があります。
2.変更がコミットされるまでイベントは発生しません。
3.このタイミングで発生した場合、DataGridViewと互換性がありません。
4.このタイミングで発生した場合、旧バージョンとの互換性がありません。
回避方法
データテーブルの値変更を検知するには、DataTableのColumnChangedイベントを使用してください。
◎サンプルコード(VB)
◎サンプルコード(C#)
◎サンプルコード(VB)
Dim wDt As New DataTable
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
wDt.Columns.Add("COL_0", GetType(Integer))
wDt.Rows.Add(0)
wDt.Rows.Add(1)
Me.C1FlexGrid1.DataSource = wDt
AddHandler wDt.ColumnChanged, AddressOf wDt_ColumnChanged
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
wDt.Rows(0)(0) = 2
End Sub
Private Sub wDt_ColumnChanged(sender As Object, e As DataColumnChangeEventArgs)
Dim rowIndex = CType(sender, DataTable).Rows.IndexOf(e.Row)
Dim colIndex = CType(sender, DataTable).Columns.IndexOf(e.Column)
Debug.WriteLine("DataTable " + rowIndex.ToString + ":" + colIndex.ToString + " でColumnChanged発生")
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
wDt.Columns.Add("COL_0", GetType(Integer))
wDt.Rows.Add(0)
wDt.Rows.Add(1)
Me.C1FlexGrid1.DataSource = wDt
AddHandler wDt.ColumnChanged, AddressOf wDt_ColumnChanged
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
wDt.Rows(0)(0) = 2
End Sub
Private Sub wDt_ColumnChanged(sender As Object, e As DataColumnChangeEventArgs)
Dim rowIndex = CType(sender, DataTable).Rows.IndexOf(e.Row)
Dim colIndex = CType(sender, DataTable).Columns.IndexOf(e.Column)
Debug.WriteLine("DataTable " + rowIndex.ToString + ":" + colIndex.ToString + " でColumnChanged発生")
End Sub
◎サンプルコード(C#)
public partial class Form1 : Form
{
DataTable wDt = new DataTable();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
wDt.Columns.Add("COL_0", typeof(int));
wDt.Rows.Add(0);
wDt.Rows.Add(1);
this.c1FlexGrid1.DataSource = wDt;
wDt.ColumnChanged += new DataColumnChangeEventHandler(wDt_ColumnChanged);
}
private void button1_Click(object sender, EventArgs e)
{
wDt.Rows[0][0] = 2;
}
private void c1FlexGrid1_CellChanged(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
Console.WriteLine(("セル" + (e.Row.ToString() + ":" + (e.Col.ToString() + "でCellChangedz発生"))));
}
private void wDt_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
Int32 rowIndex = ((DataTable)(sender)).Rows.IndexOf(e.Row);
Int32 colIndex = ((DataTable)(sender)).Columns.IndexOf(e.Column);
Console.WriteLine(("DataTable " + (rowIndex.ToString() + ":" + colIndex.ToString() + " でColumnChanged発生")));
}
}
{
DataTable wDt = new DataTable();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
wDt.Columns.Add("COL_0", typeof(int));
wDt.Rows.Add(0);
wDt.Rows.Add(1);
this.c1FlexGrid1.DataSource = wDt;
wDt.ColumnChanged += new DataColumnChangeEventHandler(wDt_ColumnChanged);
}
private void button1_Click(object sender, EventArgs e)
{
wDt.Rows[0][0] = 2;
}
private void c1FlexGrid1_CellChanged(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
{
Console.WriteLine(("セル" + (e.Row.ToString() + ":" + (e.Col.ToString() + "でCellChangedz発生"))));
}
private void wDt_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
Int32 rowIndex = ((DataTable)(sender)).Rows.IndexOf(e.Row);
Int32 colIndex = ((DataTable)(sender)).Columns.IndexOf(e.Column);
Console.WriteLine(("DataTable " + (rowIndex.ToString() + ":" + colIndex.ToString() + " でColumnChanged発生")));
}
}
旧文書番号
82503