2013-02-28 65 views
2

我有一個DataGridView中有單個文本字符..基本上像字符映射,但希望能夠從左到右選擇單元格的組,如同它是文本。自定義選擇與C#DataGridView

即如果我垂直選擇2個單元格的默認行爲僅用於選擇2個單元格。但是,我希望它選擇頂部行右側和第二行左側的所有單元格。就像在這個問題文本中突出顯示兩個垂直字符一樣。

可能嗎? (我是否設法以一種合理的方式解釋它?!)

謝謝!

編輯:添加了幾個圖像,以幫助更好地解釋這一點。

首先,如果我選擇「P」和向下拖動到「d」,這就是被選中: Default DataGridView behaviour

我想在這種情況下發生的,是這樣的: enter image description here

希望這使得它更清晰,謝謝:)

+1

很難弄清楚你在問什麼。你能附上截圖並在裏面解釋嗎? – Win 2013-02-28 21:20:36

+0

我的解決方案是否有效? – 2013-02-28 22:01:26

+0

是的,但它僅用於我的屏幕截圖中的特定情況 - 我需要一個更通用的解決方案來跨多行選擇數據。儘管如此,你讓我在正確的軌道上,所以我正在修改你的代碼給我想要的東西..我想!我會接受你的答案,一旦我有它的工作:) – Hybrid 2013-02-28 22:06:31

回答

1

這個工作,看看

private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.DataSource = li; 
     dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect; 
     dataGridView1.SelectionChanged += dataGridView1_SelectionChanged; 
    } 

    private void dataGridView1_SelectionChanged(object sender, EventArgs e) 
    { 
     var la = dataGridView1.SelectedCells; 
     if (la.Count == 2) 
     { 
      var rowFirst = ((DataGridViewCell)la[0]).RowIndex; 
      var columnFirst = ((DataGridViewCell)la[0]).ColumnIndex; 

      var rowSecond = ((DataGridViewCell)la[1]).RowIndex; 
      var columnSecond = ((DataGridViewCell)la[1]).ColumnIndex; 

      for (int column = 0; column <= columnFirst; column++) 
      { 
       dataGridView1[column, rowFirst].Selected = true; 
      } 

      for (int column = columnSecond; column < dataGridView1.ColumnCount; column++) 
      { 
       dataGridView1[column, rowSecond].Selected = true; 
      } 
     } 
    } 
0

用更通用的解決方案拓展簡單托馬斯的答案,我提出了這個問題。它不能很好地處理縮小的選擇,但對我的目的來說已經足夠了。謝謝簡單的托馬斯!

private void characterGrid_SelectionChanged(object sender, EventArgs e) 
    { 
     if (SelectionChanging == true) 
     { 
      return; 
     } 

     SelectionChanging = true; 

     var la = characterGrid.SelectedCells; 
     if (la.Count > 1) 
     { 
      var sorted = new List<DataGridViewCell>(); 
      System.Collections.IEnumerator enumerator = la.GetEnumerator(); 
      while (enumerator.MoveNext()) 
      { 
       sorted.Add((DataGridViewCell)enumerator.Current); 
      } 
      sorted.Sort(delegate(DataGridViewCell t1, DataGridViewCell t2) 
      { 
       if (t1.RowIndex != t2.RowIndex) 
       { 
        return t1.RowIndex.CompareTo(t2.RowIndex); 
       } 
       else 
       { 
        return t1.ColumnIndex.CompareTo(t2.ColumnIndex); 
       } 
      }); 

      var rowFirst = ((DataGridViewCell)sorted[ 0 ]).RowIndex; 
      var columnFirst = ((DataGridViewCell)sorted[ 0 ]).ColumnIndex; 

      var rowLast = ((DataGridViewCell)sorted[ sorted.Count - 1 ]).RowIndex; 
      var columnLast = ((DataGridViewCell)sorted[ sorted.Count - 1 ]).ColumnIndex; 

      if (rowLast > rowFirst) 
      { 
       // select first row 
       for (int column = columnFirst; column < characterGrid.ColumnCount; column++) 
       { 
        characterGrid[ column, rowFirst ].Selected = true; 
       } 

       // in between 
       for (int row = rowFirst + 1; row < rowLast; row++) 
       { 
        for (int column = 0; column < characterGrid.ColumnCount; column++) 
        { 
         characterGrid[ column, row ].Selected = true; 
        } 
       } 

       // last row 
       for (int column = 0; column <= columnLast; column++) 
       { 
        characterGrid[ column, rowLast ].Selected = true; 
       } 
      } 
     } 

     SelectionChanging = false; 
    }