2017-06-03 59 views
1

通過rowspaned小區中所有受影響的行我有以下選擇上的DataGridView

我要的是,當我選擇BOX00099電池,三排右被選中。 此外,當我選擇這三行之一,其他兩行和BOX00099被選中。 所以,這個想法是將所有三行都視爲一行。

+0

顯示實際的代碼 – Max

+0

這是一個Windows窗體應用程序,這並不重要我怎麼填充datagridview,這只是在SelectionChange事件中的技巧。 – Adnand

+0

[閱讀本文](https://stackoverflow.com/help/mcve) – Max

回答

0

我解決了這個問題,併爲那些誰可能有同樣的問題,因爲我,這就是我做的:

我用了一個擴展的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(); 
    } 
} 

然後我添加從this project列。該項目有一個演示,所以你有一個例子如何使用它。跨越一個小區,我用

var cell = (DataGridViewTextBoxCellEx)dataGridView1[0, index]; 
      int nr = (int)dataGridView1.Rows[index].Cells["Nr"].Value; 
      cell.RowSpan = nr; 

之後,從「3 spaned行」去到另一行與鍵上/下,我已經按上/下鈕3次(選擇每。排一個接一個地從「3 spaned行」爲了解決這個問題,我用它的按鍵事件如上:

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(); 
      } 
     } 
    }