背景
最近做一個Winform的小程序,需要用到分頁,由於之前一直在用 TonyPagerForWinForm.dll ,但該庫沒有源代碼,網上找的也不全面,索性就准備自己改造一個。在園子里翻了一下,發現路過秋天在多年前寫了個分頁控件,Winform 通用分頁控件實戰篇(提供源碼下載)。站在大神的肩膀上就是快,一會就改好了。
效果圖
功能比較齊全,不過樣式上,樓主十分喜歡easyUI或ext的列表分頁風格。於是換了幾個按鈕,添加了圖標,看看現在的效果。
控件源碼在正文最下方。
使用簡介
就那么一點web分頁的感覺了。具體的用法,簡單的貼一貼,更詳細的可以到秋天的博客里看看,上面有鏈接。
private void StartForm_Load(object sender, EventArgs e) { //創建文件數據庫表。 MDataTable.CreateSchema("Users.txt", false, new string[] { "UserName", "Password", "Enabled" }, SqlDbType.NVarChar, SqlDbType.NVarChar, SqlDbType.Bit); for (int i = 0; i < 200; i++)//插入200條數據。 { using (MAction action = new MAction("Users.txt", "Txt Path={0}")) { action.Set("UserName", "UserName_" + i); action.Set("Password", "Password_" + i); action.Set("Enabled", i%2==0); action.Insert(InsertOp.None); } } pagerControl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged); LoadData(); } void pagerControl1_OnPageChanged(object sender, EventArgs e) { LoadData(); } void LoadData() { int count; using (MAction action = new MAction("Users.txt", "Txt Path={0}")) { action.Select(pagerControl1.PageIndex, pagerControl1.PageSize, string.Empty, out count).Bind(gvUsers); pagerControl1.DrawControl(count); } }
關於Winform
插點題外話,好久不做Winform,有些漸漸忘記了。這里說幾點。
1.控件隨着窗口自適應,設置anchor屬性,有top left right down ,根據實際需要設置。
2.Datagrid綁定數據,如果需要綁定特殊列,如圖片,下拉框,則首先指定列頭,接着循環創建行,單元格等。
DataGridViewRow row = new DataGridViewRow(); DataGridViewTextBoxCell 編號 = new DataGridViewTextBoxCell(); 編號.Value = i++.ToString(); row.Cells.Add(編號); var state = reader["111"].ToString().AsInt(0); DataGridViewTextBoxCell OpenClose = new DataGridViewTextBoxCell(); OpenClose.Value = state > 0 ? "關閉" : "xxxxxx"; row.Cells.Add(OpenClose); var _dval = reader["222"].ToString().AsInt(0); DataGridViewTextBoxCell t1 = new DataGridViewTextBoxCell(); t1.Value = _dval; row.Cells.Add(t1); var _dmin = reader["333"].ToString().AsInt(0); DataGridViewTextBoxCell dmin = new DataGridViewTextBoxCell(); dmin.Value = _dmin; row.Cells.Add(dmin); //圖片列 DataGridViewImageCell t2 = new DataGridViewImageCell(); t2.Value = _dval > _dmin ? Properties.Resources.error : Properties.Resources.success; row.Cells.Add(t2); dataGridView1.Rows.Add(row);
3.DataGrid隨着窗口最大化,自動調整列的寬度。
一行代碼: Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; 這就搞定了,效果就是列寬會根據內容以及表頭寬度自行判斷,最后調整到合適的寬度。 AutoSizeMode這個屬性並不顯示在“屬性”窗口中。 如果你的DataGridView是動態綁定數據的, 那就只能在代碼中設置。 如果你的DataGridView列名是設計好的,那么可以在DataGridView上點擊右鍵,選擇“編輯列”,然后選中你要設置自適應的列,在它的屬性列表中的“布局”選項卡里面選擇AutoSizeMode的類型。 AutoSizeMode屬性可以設置的值還有不少: 成員名稱 說明 NotSet 列的大小調整行為從DataGridView.AutoSizeColumnsMode 屬性繼承。 None 列寬不會自動調整。 AllCells 調整列寬,以適合該列中的所有單元格的內容,包括標題單元格。 AllCellsExceptHeader 調整列寬,以適合該列中的所有單元格的內容,不包括標題單元格。 DisplayedCells 調整列寬,以適合當前屏幕上顯示的行的列中的所有單元格的內容,包括標題單元格。 DisplayedCellsExceptHeader 調整列寬,以適合當前屏幕上顯示的行的列中的所有單元格的內容,不包括標題單元格。 ColumnHeader 調整列寬,以適合列標題單元格的內容。 Fill 調整列寬,使所有列的寬度正好填充控件的顯示區域,只需要水平滾動保證列寬在DataGridViewColumn.MinimumWidth屬性值以上。相對列寬由相對DataGridViewColumn.FillWeight屬性值決定。 另外介紹: DataGridView 有一個屬性是AutoSizeColumnMode,他有幾個枚舉值: 1、AllCells 調整列寬,以適合該列中的所有單元格的內容,包括標題單元格。 2、AllCellsExceptHeader 調整列寬,以適合該列中的所有單元格的內容,不包括標題單元格。 3、ColumnHeader 調整列寬,以適合列標題單元格的內容。 4、DisplayedCells 調整列寬,以適合當前屏幕上顯示的行的列中的所有單元格的內容,包括標題單元格。 5、DisplayedCellsExceptHeader 調整列寬,以適合當前屏幕上顯示的行的列中的所有單元格的內容,不包括標題單元格。 6、Fill 調整列寬,使所有列的寬度正好填充控件的顯示區域,只需要水平滾動保證列寬在DataGridViewColumn.MinimumWidth 屬性值以上。相對列寬由相對 DataGridViewColumn.FillWeight 屬性值決定。 7、None 列寬不會 自動調整。 8、NotSet 列的大小調整行為從 DataGridView.AutoSizeColumnsMode 屬性繼承。 注:如果想要自動設置列寬.在這里就必須把DataGridView的值設置為Fill this.dataGridView.DataSource = ds.Tables[0]; this.dataGridView.Columns[0].FillWeight = 10; //第一列的相對寬度為10% this.dataGridView.Columns[1].FillWeight = 20; //第二列的相對寬度為20% this.dataGridView.Columns[2].FillWeight = 30; //第三列的相對寬度為30% 這里的值是相對於DataGridView當前的總寬度的,所以窗體最大化和縮小的效果是不一樣的,但比例不變 注:如何給每列設置標頭 設置標題字段(先把ColumnsHeadersVisible設置為true) this.dataGridView.Columns[0].HeaderText = "編號"; this.dataGridView.Columns[1].HeaderText = "日期"; this.dataGridView.Columns[2].HeaderText = "標題";