|
分類:[.NET 全般]
OS:Windows7
開発環境:Visual Studio 2010 Professional
3つのDataGridViewを水平方向に並べ、
データ(行)が追加されるときにはすべてのDataGridViewに対して同時に行追加を行おうとしています。
併せて以下の機能を実装予定です。
a. 行追加は毎回グリッドの最下行に対して行う。
行追加されたら、追加した行全体を選択状態にする。
すべてのDataGridViewに対して適用する。
b. 行クリックを行ったら、クリックされた行全体を選択状態にする。
すべてのDataGridViewに対して適用する。
c. 上下キーを使って選択行が変更になったら、
すべてのDataGridViewに対してクリックされた行全体を選択状態にする。
d. スクロールバーコントロールを動かしたら、すべてのDataGridViewのスクロールを同時に行う。
現在、行の追加と上下キーを使って選択行を変更した場合の処理ができず困っております。
現状では、2行目を追加するときプログラムを動かすとエラーになり落ちてしまいます。
(エラーは、「'System.StackOverflowException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました。」と出ました。)
現象を再現させるためのコードを書いてみました。(ここではDataGridViewを1つにしています)
SelectionChangedイベントの使い方が、間違っているのではないか?と思っているのですが
どのように実装すればよいかわからないため、ご教示お願いいたします。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private int cnt;
public Form1()
{
InitializeComponent();
dataGridView1.Columns.Add("col1", "col1");
dataGridView1.Columns.Add("col2", "col2");
dataGridView2.Columns.Add("col1", "col1");
dataGridView2.Columns.Add("col2", "col2");
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
// 縦スクロールバーの初期位置、最小値、最大値を設定
vScrollBar1.Value = 0;
vScrollBar1.Minimum = 0;
vScrollBar1.Maximum = dataGridView1.RowCount - 1;
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
dataGridView1.Rows.Add();
dataGridView2.Rows.Add();
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0].Value = cnt;
dataGridView2.Rows[dataGridView2.Rows.Count - 1].Cells[0].Value = cnt;
cnt++;
// 最新行選択(レコードセレクタ)
dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0];
dataGridView2.CurrentCell = dataGridView2.Rows[dataGridView2.Rows.Count - 1].Cells[0];
// 最新行選択
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
dataGridView2.Rows[dataGridView2.Rows.Count - 1].Selected = true;
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;
dataGridView2.FirstDisplayedScrollingRowIndex = dataGridView2.Rows.Count - 1;
vScrollBar1.Minimum = 0;
vScrollBar1.Maximum = dataGridView1.RowCount - 1;
vScrollBar1.Value = vScrollBar1.Maximum;
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView2.CurrentCell = dataGridView2.Rows[e.RowIndex].Cells[0];
dataGridView2.Rows[e.RowIndex].Selected = true;
}
private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];
dataGridView1.Rows[e.RowIndex].Selected = true;
}
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
dataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue;
dataGridView2.FirstDisplayedScrollingRowIndex = e.NewValue;
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
DataGridView dgv = sender as DataGridView;
DataGridViewCell cell = dgv.CurrentCell;
if ((dataGridView1.Rows.Count > 0) && (dataGridView2.Rows.Count > 0))
{
dataGridView1.CurrentCell = dataGridView1.Rows[cell.RowIndex].Cells[0];
dataGridView1.Rows[cell.RowIndex].Selected = true;
//dataGridView1.FirstDisplayedScrollingRowIndex = cell.RowIndex;
dataGridView2.CurrentCell = dataGridView2.Rows[cell.RowIndex].Cells[0];
dataGridView2.Rows[cell.RowIndex].Selected = true;
//dataGridView2.FirstDisplayedScrollingRowIndex = cell.RowIndex;
}
}
}
}
|