DataGridView 跳到指定選取行

  • 10323
  • 0
  • C#
  • 2014-08-22

DataGridView 跳到指定選取行

 

在使用 DataGridView 時,除了利用滑鼠控制捲軸來切換所選取的資料,或是直接使用上下鍵來移動選取行。

但還是有某些時後需要透過程式來控制目前所選取的行資料,為了不要一再重複的撰寫相同的程式,因此就改為共用程式的方式。

當然前提這個 DataGridView 的選取模式必需要設定為單選!

 

名稱定義為 JumpToRecord,動作目標為 DataGridView 控制項,動作模式設定為四種。

0:跳到第一筆、1:跳到上一筆、2:跳到下一筆、3:跳到最後一筆

另外設定了一個開關,來判斷選取行是否一定在顯示行當中。(當然預設為是)

 


public static void JumpToRecord(ref DataGridView __TargetView, int __JumpType, bool __bolCheckDisplay = true)
{
    int intCurrentIndex = -1;
    int intFirstIndex = __TargetView.FirstDisplayedScrollingRowIndex;
    if (__TargetView.SelectedRows.Count == 1) intCurrentIndex = __TargetView.SelectedRows[0].Index;


    switch (__JumpType)
    {
        case 0:
            if (intCurrentIndex != 0)
            {
                __TargetView.Rows[0].Selected = true;
                __TargetView.FirstDisplayedScrollingRowIndex = 0;
            }
            break;
        case 1:
            if (intCurrentIndex == 0) return;
            __TargetView.Rows[intCurrentIndex - 1].Selected = true;
            if ((!__TargetView.SelectedRows[0].Displayed) && __bolCheckDisplay)
            {
                __TargetView.FirstDisplayedScrollingRowIndex = __TargetView.SelectedRows[0].Index;
            }
            break;
        case 2:
            if ((intCurrentIndex + 1) >= __TargetView.Rows.Count) return;
            __TargetView.Rows[intCurrentIndex + 1].Selected = true;

            if (__bolCheckDisplay)
            {
                if (!__TargetView.SelectedRows[0].Displayed)
                {
                    __TargetView.FirstDisplayedScrollingRowIndex = __TargetView.SelectedRows[0].Index - __TargetView.DisplayedRowCount(false);
                }

                if ((__TargetView.DisplayedRowCount(true) != __TargetView.DisplayedRowCount(false)) &&
                    ((intCurrentIndex + 2 - __TargetView.FirstDisplayedScrollingRowIndex) == __TargetView.DisplayedRowCount(true)))
                {
                    __TargetView.FirstDisplayedScrollingRowIndex = __TargetView.FirstDisplayedScrollingRowIndex + 1;
                }
            }
            break;
        case 3:
            if ((intCurrentIndex + 1) >= __TargetView.Rows.Count) return;
            __TargetView.Rows[__TargetView.Rows.Count - 1].Selected = true;

            if (__bolCheckDisplay)
            {
                if ((__TargetView.Rows.Count - __TargetView.DisplayedRowCount(false) - 1) < 0)
                {
                    __TargetView.FirstDisplayedScrollingRowIndex = 0;
                }
                else
                {
                    __TargetView.FirstDisplayedScrollingRowIndex = __TargetView.Rows.Count - __TargetView.DisplayedRowCount(false) - 1;
                }

                if ((__TargetView.DisplayedRowCount(true) != __TargetView.DisplayedRowCount(false)) &&
                    ((__TargetView.Rows.Count - __TargetView.FirstDisplayedScrollingRowIndex) == __TargetView.DisplayedRowCount(true)))
                {
                    __TargetView.FirstDisplayedScrollingRowIndex = __TargetView.FirstDisplayedScrollingRowIndex + 1;
                }
            }
            break;
        default:
            return;
    }
}

 

如此一來就可以快速的應用在任何一個 DataGridView 上了!


程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的魯莽行動。