Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在datagridview上按行单元格选择所有受影响的行_C#_Datagridview_Html Table_Multi Select - Fatal编程技术网

C# 在datagridview上按行单元格选择所有受影响的行

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

我有下面的

我想要的是,当我选择BOX00099单元格时,右边要选择的三行。 另外,当我选择这三行中的一行时,将选择其他两行和BOX00099。
所以,我的想法是把所有的三行看作一行。< /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使用以下代码填充datagridview
dataGridView1.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();
            }
        }
    }