一个datagridView,一个按钮
如下面,我只需要每次跟换选中行的时候,能再次填充成功高手帮助看看啊,急死了!!!!!!!!!!!!!!!!
private void button1_Click(object sender, EventArgs e)
{
dgvData.CurrentCellChanged -= new EventHandler(dgvData_CurrentCellChanged);
DataTable dt = getdate(3);
this.dgvData.DataSource = dt;
dgvData.CurrentCellChanged += new EventHandler(dgvData_CurrentCellChanged);
} private DataTable getdate(int m)
{
DataTable dt = new DataTable();
dt.Columns.Add("id");
DataRow dr1 = dt.NewRow();
dr1["id"] = m - 1;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["id"] = m ;
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["id"] = m + 1;
dt.Rows.Add(dr3); return dt;
} private void dgvData_CurrentCellChanged(object sender, EventArgs e)
{
int n = this.dgvData.CurrentRow.Index;
DataTable dtm = (DataTable)dgvData.DataSource;
DataRow dr = dtm.Rows[n];
int a = Convert.ToInt16(dr["id"]); DataTable dt = getdate(a+1);
this.dgvData.DataSource = dt;//就是这里,在选中当前行时,不应许再填充????????
}
如下面,我只需要每次跟换选中行的时候,能再次填充成功高手帮助看看啊,急死了!!!!!!!!!!!!!!!!
private void button1_Click(object sender, EventArgs e)
{
dgvData.CurrentCellChanged -= new EventHandler(dgvData_CurrentCellChanged);
DataTable dt = getdate(3);
this.dgvData.DataSource = dt;
dgvData.CurrentCellChanged += new EventHandler(dgvData_CurrentCellChanged);
} private DataTable getdate(int m)
{
DataTable dt = new DataTable();
dt.Columns.Add("id");
DataRow dr1 = dt.NewRow();
dr1["id"] = m - 1;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["id"] = m ;
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["id"] = m + 1;
dt.Rows.Add(dr3); return dt;
} private void dgvData_CurrentCellChanged(object sender, EventArgs e)
{
int n = this.dgvData.CurrentRow.Index;
DataTable dtm = (DataTable)dgvData.DataSource;
DataRow dr = dtm.Rows[n];
int a = Convert.ToInt16(dr["id"]); DataTable dt = getdate(a+1);
this.dgvData.DataSource = dt;//就是这里,在选中当前行时,不应许再填充????????
}
先点button1没问题,在移动当前行,Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.这个错,搞死人
this.dgvData.DataSource=null
是否有数据
给个建议,换事件来模拟这个效果(比如点击DataGridView,键盘的光标键事件等)。
凭空想的,未验证,只是个建议啊。
{
int n = this.dgvData.CurrentRow.Index;
DataTable dtm;
//int a = Convert.ToInt16(dr["id"]);
int a=Convert.ToInt16(this.dgvData.CurrentRow["id"]); DataTable dt = getdate(a+1);
this.dgvData.DataSource = dt;//就是这里,在选中当前行时,不应许再填充????????
}
我没试过,意思就是找取当前行的"id"所在单无格,取出id.
因为cell改变的时候需要调用SetCurrentCellAddressCore进行改变
当你重新绑定时,当前活动状态的单元格发生了改变,出现问题吧
你换一个别的事件处理吧,用CellValueChanged事件处理
我要的效果是,更换当前行时,取出当前行数据,然后根据当前行数据,找出相匹配的三条数据填充到datagridview,我感觉是选中这个datagridview的当前行时是不能填充它的,现在我需要方法
因为private DataTable getdate(int m)返回的永远只有3行,如果这就是你的目的,那我就不多说了。
private void button1_Click(object sender, EventArgs e)
{
//部分代码可以放置到Form_Load中执行。
this.dgvData.MultiSelect = false;
dgvData.MouseClick -= new MouseEventHandler(dgvData_MouseClick);
dgvData.KeyDown -= new KeyEventHandler(dgvData_KeyDown);
DataTable dt = getdate(3);
this.dgvData.DataSource = dt;
dgvData.MouseClick += new MouseEventHandler(dgvData_MouseClick);
dgvData.KeyDown += new KeyEventHandler(dgvData_KeyDown);
} private void dgvData_MouseClick(object sender, MouseEventArgs e)
{
if (n == -1 || n != this.dgvData.CurrentRow.Index)
{
n = this.dgvData.CurrentRow.Index;
DataTable dtm = (DataTable)dgvData.DataSource;
DataRow dr = dtm.Rows[n];
int a = Convert.ToInt16(dr["id"]); DataTable dt = getdate(a + 1);
this.dgvData.DataSource = dt; this.dgvData.Rows[n].Cells[0].Selected = true;//设置当前选中行。
}
} void dgvData_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up || e.KeyCode == Keys.Tab)
{
if (n == -1 || n != this.dgvData.CurrentRow.Index)
{
n = this.dgvData.CurrentRow.Index;
DataTable dtm = (DataTable)dgvData.DataSource;
DataRow dr = dtm.Rows[n];
int a = Convert.ToInt16(dr["id"]); DataTable dt = getdate(a + 1);
this.dgvData.DataSource = dt; this.dgvData.Rows[n].Cells[0].Selected = true;//设置当前选中行。
}
}
} int n = -1;//定义外部变量n,用于记录上次选择行。
如果纯鼠标操作,且每次更新dgvData后,无需记录当前选中行,则可将
this.dgvData.Rows[n].Cells[0].Selected = true;//设置当前选中行。
改为
n = -1;//初始化上次选择行。