C# 在datagridview上按行单元格选择所有受影响的行
我有下面的 我想要的是,当我选择BOX00099单元格时,右边要选择的三行。 另外,当我选择这三行中的一行时,将选择其他两行和BOX00099。C# 在datagridview上按行单元格选择所有受影响的行,c#,datagridview,html-table,multi-select,C#,Datagridview,Html Table,Multi Select,我有下面的 我想要的是,当我选择BOX00099单元格时,右边要选择的三行。 另外,当我选择这三行中的一行时,将选择其他两行和BOX00099。 所以,我的想法是把所有的三行看作一行。< /P> < P>我解决了这个问题,对于那些可能和我有同样问题的人,我就是这样做的: 我使用了扩展的datagridview,而不是普通的datagridview public partial class DataGridViewEx : DataGridView { public DataGridVi
所以,我的想法是把所有的三行看作一行。< /P> < P>我解决了这个问题,对于那些可能和我有同样问题的人,我就是这样做的: 我使用了扩展的datagridview,而不是普通的datagridview
public partial class DataGridViewEx : DataGridView
{
public DataGridViewEx()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
protected override void SetSelectedRowCore(int rowIndex, bool selected)
{
this.SuspendLayout();
base.SetSelectedRowCore(rowIndex, selected);
int index = rowIndex;
while (index < this.Rows.Count - 1 && this.Rows[index].Cells["BoxNo"].Value.ToString() == this.Rows[index + 1].Cells["BoxNo"].Value.ToString())
{
base.SetSelectedRowCore(index + 1, selected);
index = index + 1;
}
index = rowIndex;
while (index > 0 && this.Rows[index].Cells["BoxNo"].Value.ToString() == this.Rows[index - 1].Cells["BoxNo"].Value.ToString())
{
base.SetSelectedRowCore(index - 1, selected);
index = index - 1;
}
this.ResumeLayout();
}
}
之后,要使用上/下键从“3跨行”转到另一行,我必须按下上/下按钮3次(从“3跨行”中逐个选择每一行)。要解决此问题,我使用上面的按键事件:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (dataGridView1.Rows.Count > 0)
{
int current = dataGridView1.CurrentRow.Index;
if (e.KeyData == Keys.Down)
{
e.Handled = true;
dataGridView1.SuspendLayout();
for (int i = current; i < dataGridView1.Rows.Count; i++)
{
if (dataGridView1.CurrentRow.Cells["BoxNo"].Value.ToString() != dataGridView1.Rows[i].Cells["BoxNo"].Value.ToString())
{
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells["BoxNo"];
break;
}
}
dataGridView1.ResumeLayout();
}
else if (e.KeyData == Keys.Up)
{
e.Handled = true;
dataGridView1.SuspendLayout();
for (int i = current; i >= 0; i--)
{
if (dataGridView1.CurrentRow.Cells["BoxNo"].Value.ToString() != dataGridView1.Rows[i].Cells["BoxNo"].Value.ToString())
{
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells["BoxNo"];
break;
}
}
dataGridView1.ResumeLayout();
}
}
}
private void dataGridView1\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(dataGridView1.Rows.Count>0)
{
int current=dataGridView1.CurrentRow.Index;
if(e.KeyData==Keys.Down)
{
e、 已处理=正确;
dataGridView1.SuspendLayout();
for(int i=current;i=0;i--)
{
if(dataGridView1.CurrentRow.Cells[“BoxNo”].Value.ToString()!=dataGridView1.Rows[i]。Cells[“BoxNo”].Value.ToString())
{
dataGridView1.CurrentCell=dataGridView1.Rows[i]。单元格[“BoxNo”];
打破
}
}
dataGridView1.ResumeLayout();
}
}
}
显示实际代码。这是一个Windows窗体应用程序,如何填充datagridview并不重要,关键在于选择更改事件。由于看到代码“不重要”…因此我只能假设看到答案同样“不重要”好的。datagridview是我得到的一个自定义控件类。然后我只需声明列,填充datagridview,并使用cell.RowSpan=nr
I使用以下代码填充datagridviewdataGridView1.DataSource=Boxing_History.getHistoryBoxing(getStartingDatetime(),getEndingDatetime()),txtBoxNo.Text,out getDataStatus);
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (dataGridView1.Rows.Count > 0)
{
int current = dataGridView1.CurrentRow.Index;
if (e.KeyData == Keys.Down)
{
e.Handled = true;
dataGridView1.SuspendLayout();
for (int i = current; i < dataGridView1.Rows.Count; i++)
{
if (dataGridView1.CurrentRow.Cells["BoxNo"].Value.ToString() != dataGridView1.Rows[i].Cells["BoxNo"].Value.ToString())
{
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells["BoxNo"];
break;
}
}
dataGridView1.ResumeLayout();
}
else if (e.KeyData == Keys.Up)
{
e.Handled = true;
dataGridView1.SuspendLayout();
for (int i = current; i >= 0; i--)
{
if (dataGridView1.CurrentRow.Cells["BoxNo"].Value.ToString() != dataGridView1.Rows[i].Cells["BoxNo"].Value.ToString())
{
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells["BoxNo"];
break;
}
}
dataGridView1.ResumeLayout();
}
}
}