DataGridView使用bindingNavigator實現分頁功能(應用存儲過程)

想法是這樣的:使用bindingNavigator+存儲過程實現DataGridView的分頁功能,其中包含簡單的查詢。

存儲過程如下:

--創建分頁查詢存儲過程(含輸出參數,輸入參數(含搜索功能))
use HotelDB
if exists(select * from sys.procedures where name='pro_getGuestRecord')
drop procedure pro_getGuestRecord
go

create procedure pro_getGuestRecord
    @pageSize int,
    @pageIndex int,
    @beginTime datetime,
    @endTime datetime,
    @ResideID int,
    @RecordCount int output
as
begin
    declare @sqlStr0 nvarchar(max);
    set @sqlStr0 = 'SELECT @RecordCount=count(a.GuestID) 
    FROM GuestRecord AS a INNER JOIN
        Room AS b ON a.RoomID = b.RoomID INNER JOIN
        ResideState AS e ON a.ResideID = e.ResideID INNER JOIN
        RoomType AS d ON b.RoomTypeID = d.TypeID INNER JOIN
        RoomState AS c ON b.RoomStateID = c.RoomStateID'
    set @sqlStr0 +=' WHERE (a.ResideDate BETWEEN ''' + CAST(@beginTime as nvarchar)+ ''' AND '''+ CAST(@endTime as nvarchar)+ ''')';
    if(@ResideID <> 0)
    begin
        set @sqlStr0 += ' AND (e.ResideID = '+CAST(@ResideID AS nvarchar)+')';
    end
    
    declare @sqlStr1 varchar(max);
    set @sqlStr1 = 'select * from(
        select row_number() over(order by a.GuestID asc) as num,
        a.GuestID, a.GuestName, a.ResideDate, a.Reposit, a.LeaveDate, a.TotalMoney, b.RoomID, d.TypeName, 
        c.RoomStateName, b.RoomStateID 
        FROM GuestRecord AS a INNER JOIN Room AS b ON a.RoomID = b.RoomID
        INNER JOIN ResideState AS e ON a.ResideID = e.ResideID
        INNER JOIN RoomType AS d ON b.RoomTypeID = d.TypeID
        INNER JOIN RoomState AS c ON b.RoomStateID = c.RoomStateID'
        set @sqlStr1 +=' WHERE (a.ResideDate BETWEEN ''' + CAST(@beginTime as varchar)+ ''' AND '''+ CAST(@endTime as nvarchar)+ ''')';
        if(@ResideID <> 0)
        begin
            set @sqlStr1 += ' AND (e.ResideID = '+CAST(@ResideID AS nvarchar)+')';
        end
    set @sqlStr1 +=') as GuestRecordInfo';
    set @sqlStr1 +=' where num between '+CAST(@pageSize as nvarchar)+'*('+CAST(@pageIndex as nvarchar)+'-1)+1 and '+CAST(@pageSize as nvarchar)+'*'+CAST(@pageIndex as nvarchar)+'';
    execute sp_executesql @sqlStr0,N'@RecordCount int output',@RecordCount output
    --execute sp_executesql @sqlStr1
    exec(@sqlStr1);
end

winform界面設計如下:

 

主要的CS代碼如下:

//每頁顯示記錄數
        private int pageSize = 2;
        //當前頁碼
        private int pageIndex = 1;
        //總頁數
        private int pageCount = 0;
        //總記錄數
        private int RecordCount = 0;

        //默認顯示當天的全部入住狀態的數據。
        //開始時間
        private DateTime beginTime = DateTime.Now.Date;
        //截止時間
        private DateTime endTime = DateTime.Now.Date.AddDays(1);
        //入住狀態ID
        private int ResideID = 0;

private void Form_Load(object sender, EventArgs e)
        {
            Bind();

            //綁定DataGridView數據。
            setDGVData();
            //設置分頁顯示數據
            setPageDate();
            //設置下拉選擇可選內容
            setComboBoxDataSource();
        }

//綁定查詢處ComboBox數據源
        private void Bind()
        {
            this.cbbResideState.DataSource = ResideStateManager.GetResideStateList();
            this.cbbResideState.ValueMember = "ResideID";
            this.cbbResideState.DisplayMember = "ResideName";
        }

//查詢
        private void btnQuery_Click(object sender, EventArgs e)
        {
            pageIndex = 1;
            beginTime = Convert.ToDateTime(dtpStartTime.Text.Trim());
            endTime = Convert.ToDateTime(dtpEndTime.Text.Trim()).AddDays(1);
            ResideID = Convert.ToInt32(cbbResideState.SelectedValue);

            //綁定DataGridView數據。
            setDGVData();
            //設置分頁顯示數據
            setPageDate();
            //設置下拉選擇可選內容
            setComboBoxDataSource();
        }

//綁定DataGridView數據。
        private void setDGVData()
        {
            DataTable GuestInfo = GuestRecordManager.GetGuestInfoByPage(beginTime, endTime, ResideID, pageSize, pageIndex, ref RecordCount);
            dgvRecordInfo.DataSource = GuestInfo;
            //設置“入住時間”、“離開時間”的顯示格式 
            dgvRecordInfo.Columns[2].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            dgvRecordInfo.Columns[4].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";            
        }

//設置分頁顯示數據
        private void setPageDate()
        {
            //計算總頁數
            if (RecordCount % pageSize == 0)
            {
                pageCount = RecordCount / pageSize;
            }
            else
            {
                pageCount = RecordCount / pageSize + 1;
            }

            //設置顯示的當前頁碼
            this.bindingNavigatorPositionItem.Text = pageIndex.ToString();
            //設置顯示的總頁數
            this.bindingNavigatorCountItem.Text = "/ {" + pageCount.ToString() + "}";
            //設置顯示的總記錄數
            this.toolStripLabel_totalRecord.Text = "共" + RecordCount.ToString() + "條記錄";

            //設置“首頁”、“前一頁”、“下一頁”、“尾頁”按鈕的可用性
            if (RecordCount == 0)
            {
                this.bindingNavigatorMoveFirstItem.Enabled = false;
                this.bindingNavigatorMovePreviousItem.Enabled = false;
                this.bindingNavigatorMoveNextItem.Enabled = false;
                this.bindingNavigatorMoveLastItem.Enabled = false;
            }
            else
            {
                setPageButtonEnable();
            }
        }

//設置“首頁”、“前一頁”、“下一頁”、“尾頁”按鈕的可用性
        private void setPageButtonEnable()
        {
            if (pageIndex <= 1 && pageIndex == pageCount)//只有1頁數據時
            {
                this.bindingNavigatorMoveFirstItem.Enabled = false;
                this.bindingNavigatorMovePreviousItem.Enabled = false;
                this.bindingNavigatorMoveNextItem.Enabled = false;
                this.bindingNavigatorMoveLastItem.Enabled = false;
            }
            else if (pageIndex <= 1)
            {
                this.bindingNavigatorMoveFirstItem.Enabled = false;
                this.bindingNavigatorMovePreviousItem.Enabled = false;
                this.bindingNavigatorMoveNextItem.Enabled = true;
                this.bindingNavigatorMoveLastItem.Enabled = true;
            }
            else if (pageIndex >= pageCount)
            {
                this.bindingNavigatorMoveFirstItem.Enabled = true;
                this.bindingNavigatorMovePreviousItem.Enabled = true;
                this.bindingNavigatorMoveNextItem.Enabled = false;
                this.bindingNavigatorMoveLastItem.Enabled = false;
            }
            else
            {
                this.bindingNavigatorMoveFirstItem.Enabled = true;
                this.bindingNavigatorMovePreviousItem.Enabled = true;
                this.bindingNavigatorMoveNextItem.Enabled = true;
                this.bindingNavigatorMoveLastItem.Enabled = true;
            }
        }

//設置toolStripComboBox1下拉選擇可選內容
        private void setComboBoxDataSource()
        {
            List<ClassIntString> comboBoxDataList = new List<ClassIntString>();
            ClassIntString data;
            for (int i = 1; i <= pageCount; i++)
            {
                data = new ClassIntString();
                data.id = i;
                data.name = "第" + i + "頁";
                comboBoxDataList.Add(data);
            }
            this.toolStripComboBox1.ComboBox.DataSource = comboBoxDataList;
            this.toolStripComboBox1.ComboBox.ValueMember = "id";
            this.toolStripComboBox1.ComboBox.DisplayMember = "name";
            this.toolStripComboBox1.ComboBox.SelectedValue = 1;
        }

//自定義類ClassIntString:

    //public class ClassIntString
    //{
    //    public int id { get; set; }
    //    public string name { get; set; }
    //}

//首頁
        private void bindingNavigatorMoveFirstItem_Click(object sender, EventArgs e)
        {
            this.toolStripComboBox1.SelectedIndex = 0;
        }
        //上一頁
        private void bindingNavigatorMovePreviousItem_Click(object sender, EventArgs e)
        {
            this.toolStripComboBox1.SelectedIndex = pageIndex - 2;
        }
        //下一頁
        private void bindingNavigatorMoveNextItem_Click(object sender, EventArgs e)
        {
            this.toolStripComboBox1.SelectedIndex = pageIndex;
        }
        //尾頁
        private void bindingNavigatorMoveLastItem_Click(object sender, EventArgs e)
        {
            this.toolStripComboBox1.SelectedIndex = pageCount - 1;
        }
        //下拉切換到指定分頁
        private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            pageIndex = this.toolStripComboBox1.SelectedIndex + 1;
            //綁定DataGridView數據。
            setDGVData();
            //設置分頁顯示數據
            setPageDate();
            this.toolStripComboBox1.ComboBox.SelectedValue = pageIndex;
        }

聲明:設計過程主要從以下文章得到啓發:https://blog.csdn.net/xiazhipeng1000/article/details/78378613

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章