none
DataGridView でセルを範囲選択したときの最初の選択位置取得 RRS feed

  • 質問

  • いつもありがとうございます。

    DataGridView でセルを範囲選択したときに、その選択範囲の最初の選択位置の行と列を取得したいのです。

    たとえば、dataGridView1.CurrentRow という方法では、選択した最後の行が返ります。

    どうしたらよいのでしょうか?よろしくお願いいたします。

    2010年4月25日 4:28

回答

  • SelectedCells[0]じゃ駄目ってことですか?
    それならSelectionChangedのタイミングでひとつしか選択されていないときの状態を最初の選択位置として記録しておけばいいです。
    ただし、Ctrlを押しながらクリックすると選択解除されるのでその場合にどうするの考える必要がありますよ。

    public class DataGridViewEx : DataGridView
    {
      private int indexFirstRow = -1;
      private int indexFirstColumn = -1;
    
      protected override void OnSelectionChanged(EventArgs e)
      {
        int singleSelect;
        switch (this.SelectionMode)
        {
        case DataGridViewSelectionMode.CellSelect: //through
        case DataGridViewSelectionMode.RowHeaderSelect://through
        case DataGridViewSelectionMode.ColumnHeaderSelect:
          singleSelect = 1;
          break;
        case DataGridViewSelectionMode.FullRowSelect:
          singleSelect = this.Columns.Count;
          break;
        case DataGridViewSelectionMode.FullColumnSelect:
          singleSelect = this.Rows.Count;
          break;
        default:
          singleSelect = -1;
          break;
        }
    
        if (this.SelectedCells.Count == 0)
        {
          indexFirstColumn = -1;
          indexFirstRow = -1;
        }
        else if (this.SelectedCells.Count == singleSelect)
        {
          indexFirstRow = this.CurrentCell.RowIndex;
          indexFirstColumn = this.CurrentCell.ColumnIndex;
        }
    
        base.OnSelectionChanged(e);
      }
    
      public DataGridViewCell FirstCelectedCell
      {
        get
        {
          DataGridViewCell cell;
          if (this.SelectedCells.Count == 0)
          {
            return null;
          }
    
          if (0 <= indexFirstRow && indexFirstRow < this.Rows.Count
          && 0 <= indexFirstColumn && indexFirstColumn < this.Columns.Count)
          {
            cell = this[indexFirstColumn , indexFirstRow];
            if (cell.Selected)
            {
              return cell;
            }
          }
    
          cell = this.SelectedCells[0];
          indexFirstColumn = cell.ColumnIndex;
          indexFirstRow = cell.RowIndex;
          return cell;
    
        }
      }
    

     

     

    • 回答としてマーク yasheeki 2010年4月25日 13:25
    2010年4月25日 6:15

すべての返信

  • SelectedCells[0]じゃ駄目ってことですか?
    それならSelectionChangedのタイミングでひとつしか選択されていないときの状態を最初の選択位置として記録しておけばいいです。
    ただし、Ctrlを押しながらクリックすると選択解除されるのでその場合にどうするの考える必要がありますよ。

    public class DataGridViewEx : DataGridView
    {
      private int indexFirstRow = -1;
      private int indexFirstColumn = -1;
    
      protected override void OnSelectionChanged(EventArgs e)
      {
        int singleSelect;
        switch (this.SelectionMode)
        {
        case DataGridViewSelectionMode.CellSelect: //through
        case DataGridViewSelectionMode.RowHeaderSelect://through
        case DataGridViewSelectionMode.ColumnHeaderSelect:
          singleSelect = 1;
          break;
        case DataGridViewSelectionMode.FullRowSelect:
          singleSelect = this.Columns.Count;
          break;
        case DataGridViewSelectionMode.FullColumnSelect:
          singleSelect = this.Rows.Count;
          break;
        default:
          singleSelect = -1;
          break;
        }
    
        if (this.SelectedCells.Count == 0)
        {
          indexFirstColumn = -1;
          indexFirstRow = -1;
        }
        else if (this.SelectedCells.Count == singleSelect)
        {
          indexFirstRow = this.CurrentCell.RowIndex;
          indexFirstColumn = this.CurrentCell.ColumnIndex;
        }
    
        base.OnSelectionChanged(e);
      }
    
      public DataGridViewCell FirstCelectedCell
      {
        get
        {
          DataGridViewCell cell;
          if (this.SelectedCells.Count == 0)
          {
            return null;
          }
    
          if (0 <= indexFirstRow && indexFirstRow < this.Rows.Count
          && 0 <= indexFirstColumn && indexFirstColumn < this.Columns.Count)
          {
            cell = this[indexFirstColumn , indexFirstRow];
            if (cell.Selected)
            {
              return cell;
            }
          }
    
          cell = this.SelectedCells[0];
          indexFirstColumn = cell.ColumnIndex;
          indexFirstRow = cell.RowIndex;
          return cell;
    
        }
      }
    

     

     

    • 回答としてマーク yasheeki 2010年4月25日 13:25
    2010年4月25日 6:15
  • 丁寧な解説をありがとうございます。

    よくありがちな処理であって何らかのメソッドがあるかと思っていたら、ずいぶんと面倒な処理が必要になってしまうのですね。

    恐れ入ります。

     

    2010年4月25日 13:25