c# 一些控制元件使用方法
ListBox:
1. 屬性列表:
SelectionMode 元件中條目的選擇型別,即多選(Multiple)、單選(Single)
Rows 列表框中顯示總共多少行
Selected 檢測條目是否被選中
SelectedItem 返回的型別是ListItem,獲得列表框中被選擇的條目
Count 列表框中條目的總數
SelectedIndex 列表框中被選擇項的索引值
Items 泛指列表框中的所有項,每一項的型別都是ListItem
2. 取列表框中被選中的值
ListBox.SelectedValue
ListBox.Text
3. 動態的新增列表框中的項:
ListBox.Items.Add("所要新增的項");
4. 移出指定項:
//首先判斷列表框中的項是否大於0
If(ListBox.Items.Count > 0 )
{
//移出選擇的項
ListBox.Items.Remove(ListBox.SelectedItem);
}
5. 清空所有項:
//首先判斷列表框中的項是否大於0
If(ListBox.Items.Count > 0 )
{
//清空所有項
ListBox.Items.Clear();
}
6. 列表框可以一次選擇多項:
只需設定列表框的屬性 SelectionMode="Multiple",按Ctrl可以多選
7. 兩個列表框聯動,即兩級聯動選單
//判斷第一個列表框中被選中的值
switch(ListBox1.SelectValue)
{
//如果是"A",第二個列表框中就新增這些:
case "A"
ListBox2.Items.Clear();
ListBox2.Items.Add("A1");
ListBox2.Items.Add("A2");
ListBox2.Items.Add("A3");
//如果是"B",第二個列表框中就新增這些:
case "B"
ListBox2.Items.Clear();
ListBox2.Items.Add("B1");
ListBox2.Items.Add("B2");
ListBox2.Items.Add("B3");
}
8. 實現列表框中項的移位
即:向上移位、向下移位
具體的思路為:建立一個ListBox物件,並把要移位的項先暫放在這個物件中。
如果是向上移位,就是把當前選定項的的上一項的值賦給當前選定的項,然後
把剛才新加入的物件的值,再附給當前選定項的前一項。
具體程式碼為:
//定義一個變數,作移位用
index = -1;
//將當前條目的文字以及值都儲存到一個臨時變數裡面
ListItem lt=new ListItem (ListBox.SelectedItem.Text,ListBox.SelectedValue);
//被選中的項的值等於上一條或下一條的值
ListBox.Items[ListBox.SelectedIndex].Text=ListBox.Items[ListBox.SelectedIndex + index].Text;
//被選中的項的值等於上一條或下一條的值
ListBox.Items[ListBox.SelectedIndex].Value=ListBox.Items[ListBox.SelectedIndex + index].Value;
//把被選中項的前一條或下一條的值用臨時變數中的取代
ListBox.Items[ListBox.SelectedIndex].Test=lt.Test;
//把被選中項的前一條或下一條的值用臨時變數中的取代
ListBox.Items[ListBox.SelectedIndex].Value=lt.Value;
//把滑鼠指標放到移動後的那項上
ListBox.Items[ListBox.SelectedIndex].Value=lt.Value;
9. 移動指標到指定位置:
(1).移至首條
//將被選中項的索引設定為0就OK了
ListBox.SelectIndex=0;
(2).移至尾條
//將被選中項的索引設定為ListBox.Items.Count-1就OK了
ListBox.SelectIndex=ListBox.Items.Count-1;
(3).上一條
//用當前被選中的索引去減 1
ListBox.SelectIndex=ListBox.SelectIndex - 1;
(4).下一條
//用當前被選中的索引去加 1
ListBox.SelectIndex=ListBox.SelectIndex + 1;
this.ListBox1.Items.Insertat(3,new ListItem("插入在第3行之後項",""));
this.ListBox1.Items.Insertat(index,ListItem)
ListBox1.Items.Insert(0,new ListItem("text","value"));
DataGridView:
1、datagridview可以通過datasource賦值,但賦值後不可再通過add方法來新增新行,網上有人以bindingsource來中轉datasource,但研究後貌似不可行,有待繼續驗證。可以通過datatable再一次賦值解決。
2、datagridview不用datasource新增資料的兩種方法:
方法一:
int index=this.dataGridView1.Rows.Add();
this.dataGridView1.Rows[index].Cells[0].Value = "1";
this.dataGridView1.Rows[index].Cells[1].Value = "2";
this.dataGridView1.Rows[index].Cells[2].Value = "監聽";
方法二:
DataGridViewRow
row = new DataGridViewRow();
DataGridViewTextBoxCell textboxcell = new DataGridViewTextBoxCell();
textboxcell.Value = "aaa";
row.Cells.Add(textboxcell);
DataGridViewComboBoxCell comboxcell = new DataGridViewComboBoxCell();
row.Cells.Add(comboxcell);
dataGridView1.Rows.Add(row);
方法二雖複雜,但可以新增button,label等控制元件。
3、 DataGridView 屬性說明
① 取得或者修改當前單元格的內容
② 設定單元格只讀
③ 不顯示最下面的新行
④ 判斷新增行
⑤ 行的使用者刪除操作的自定義
⑥ 行、列的隱藏和刪除
⑦ 禁止列或者行的Resize
⑧ 列寬和行高以及列頭的高度和行頭的寬度的自動調整
⑨ 凍結列或行
⑩ 列順序的調整
? 行頭列頭的單元格
? 剪下板的操作
? 單元格的ToolTip的設定
? 右鍵選單(ContextMenuStrip)的設定
? 單元格的邊框、 網格線樣式的設定
? 單元格表示值的設定
? 使用者輸入時,單元格輸入值的設定
? 設定新加行的預設值
--------------------------------------------------------------------------------
① DataGridView 取得或者修改當前單元格的內容:
當前單元格指的是 DataGridView 焦點所在的單元格,它可以通過 DataGridView 物件的 CurrentCell 屬性取得。如果當前單元格不存在的時候,返回Nothing(C#是null)
// 取得當前單元格內容
Console.WriteLine(DataGridView1.CurrentCell.Value);
// 取得當前單元格的列 Index
Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex);
// 取得當前單元格的行 Index
Console.WriteLine(DataGridView1.CurrentCell.RowIndex);
另外,使用 DataGridView.CurrentCellAddress 屬性(而不是直接訪問單元格)來確定單元格所在的
行: DataGridView.CurrentCellAddress.Y
列: DataGridView.CurrentCellAddress.X 。這對於避免取消共享行的共享非常有用。
當前的單元格可以通過設定 DataGridView 物件的 CurrentCell 來改變。可以通過 CurrentCell 來設定
DataGridView 的啟用單元格。將 CurrentCell 設為 Nothing(null) 可以取消啟用的單元格。
--------------------------------------------------------------------------------
// 設定 (0, 0) 為當前單元格
DataGridView1.CurrentCell = DataGridView1[0, 0];
在整行選中模式開啟時,你也可以通過 CurrentCell 來設定選定行。
/// 向下遍歷
private void button4_Click(object sender, EventArgs e)
...{
int row = this.dataGridView1.CurrentRow.Index + 1;
if (row > this.dataGridView1.RowCount - 1)
row = 0;
this.dataGridView1.CurrentCell = this.dataGridView1[0, row];
}
/// 向上遍歷
private void button5_Click(object sender, EventArgs e)
...{
int row = this.dataGridView1.CurrentRow.Index - 1;
if (row < 0)
row = this.dataGridView1.RowCount - 1;
this.dataGridView1.CurrentCell = this.dataGridView1[0, row];
}
* 注意: this.dataGridView 的索引器的引數是: columnIndex, rowIndex 或是 columnName, rowIndex
這與習慣不同。
--------------------------------------------------------------------------------
② DataGridView 設定單元格只讀:
1) 使用 ReadOnly 屬性
如果希望,DataGridView 內所有單元格都不可編輯, 那麼只要:
// 設定 DataGridView1 為只讀
DataGridView1.ReadOnly = true;此時,使用者的新增行操作和刪除行操作也被遮蔽了。
如果希望,DataGridView 內某個單元格不可編輯, 那麼只要:
// 設定 DataGridView1 的第2列整列單元格為只讀
DataGridView1.Columns[1].ReadOnly = true;
// 設定 DataGridView1 的第3行整行單元格為只讀
DataGridView1.Rows[2].ReadOnly = true;
// 設定 DataGridView1 的[0,0]單元格為只讀
DataGridView1[0, 0].ReadOnly = true;
2) 使用 EditMode 屬性
DataGridView.EditMode 屬性被設定為 DataGridViewEditMode.EditProgrammatically 時,使用者就不能手動編輯單元格的內容了。但是可以通過程式,呼叫 DataGridView.BeginEdit 方法,使單元格進入編輯模式進行編輯。
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
3) 根據條件設定單元格的不可編輯狀態
當一個一個的通過單元格座標設定單元格 ReadOnly 屬性的方法太麻煩的時候,你可以通過 CellBeginEdit 事件來取消單元格的編輯。
// CellBeginEdit 事件處理方法
private void DataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
//是否可以進行編輯的條件檢查
if (dgv.Columns[e.ColumnIndex].Name == "Column1" && !(bool)dgv["Column2", e.RowIndex].Value)
{
// 取消編輯
e.Cancel = true;
}
}
--------------------------------------------------------------------------------
③ DataGridView 不顯示最下面的新行:
通常 DataGridView 的最下面一行是使用者新追加的行(行頭顯示 * )。如果不想讓使用者新追加行即不想顯示該新行,可以將 DataGridView 物件的 AllowUserToAddRows 屬性設定為 False。
// 設定使用者不能手動給 DataGridView1 新增新行
DataGridView1.AllowUserToAddRows = false;
但是,可以通過程式: DataGridViewRowCollection.Add 為 DataGridView 追加新行。
補足: 如果 DataGridView 的 DataSource 繫結的是 DataView, 還可以通過設定 DataView.AllowAdd
屬性為 False 來達到同樣的效果。
--------------------------------------------------------------------------------
④ DataGridView 判斷新增行:
DataGridView 的AllowUserToAddRows屬性為True時也就是允許使用者追加新行的場合下,DataGridView的最後一行就是新追加的行(*行)。
使用 DataGridViewRow.IsNewRow 屬性可以判斷哪一行是新追加的行。另外,通過DataGridView.NewRowIndex 可以獲取新行的行序列號.
在沒有新行的時候,NewRowIndex = -1。
--------------------------------------------------------------------------------
⑤ DataGridView 行的使用者刪除操作的自定義:
1) 無條件的限制行刪除操作。
預設時,DataGridView 是允許使用者進行行的刪除操作的。如果設定 DataGridView物件的AllowUserToDeleteRows屬性為 False 時, 使用者的行刪除操作就被禁止了。
// 禁止DataGridView1的行刪除操作。
DataGridView1.AllowUserToDeleteRows = false;
但是,通過 DataGridViewRowCollection.Remove 還是可以進行行的刪除。
補足: 如果 DataGridView 繫結的是 DataView 的話,通過 DataView.AllowDelete 也可以控制行的刪除。
2) 行刪除時的條件判斷處理。
使用者在刪除行的時候,將會引發 DataGridView.UserDeletingRow 事件。 在這個事件裡,可以判斷條件並取消刪除操作。
// DataGridView1 的 UserDeletingRow 事件
private void DataGridView1_UserDeletingRow( object sender, DataGridViewRowCancelEventArgs e)
{
// 刪除前的使用者確認。
if (MessageBox.Show("確認要刪除該行資料嗎?", "刪除確認",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
{
// 如果不是 OK,則取消。
e.Cancel = true;
}
}
--------------------------------------------------------------------------------
⑥ DataGridView 行、列的隱藏和刪除:
1) 行、列的隱藏
// DataGridView1的第一列隱藏
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隱藏
DataGridView1.Rows[0].Visible = false;
2) 行頭、列頭的隱藏
// 列頭隱藏
DataGridView1.ColumnHeadersVisible = false;
// 行頭隱藏
DataGridView1.RowHeadersVisible = false;
3) 行和列的刪除
' 刪除名為"Column1"的列
DataGridView1.Columns.Remove("Column1");
' 刪除第一列
DataGridView1.Columns.RemoveAt(0);
' 刪除第一行
DataGridView1.Rows.RemoveAt(0);
4) 刪除選中行
foreach (DataGridViewRow r in DataGridView1.SelectedRows)
{
if (!r.IsNewRow)
{
DataGridView1.Rows.Remove(r);
}
}
--------------------------------------------------------------------------------
⑦ DataGridView 禁止列或者行的Resize:
1) 禁止所有的列或者行的Resize
// 禁止使用者改變DataGridView1的所有列的列寬
DataGridView1.AllowUserToResizeColumns = false;
//禁止使用者改變DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = false;
但是可以通過 DataGridViewColumn.Width 或者 DataGridViewRow.Height 屬性設定列寬和行高。
2) 禁止指定行或者列的Resize
// 禁止使用者改變DataGridView1的第一列的列寬
DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;
// 禁止使用者改變DataGridView1的第一列的行寬
DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;
關於 NoSet :
當 Resizable 屬性設為 DataGridViewTriState.NotSet 時, 實際上會預設以 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的屬性值進行設定。
比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 設定時,Resizable = False 。
判斷 Resizable 是否是繼承設定了 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的屬性值,
可以根據 State 屬性判斷。如果 State 屬性含有 ResizableSet,那麼說明沒有繼承設定。
3) 列寬和行高的最小值的設定
// 第一列的最小列寬設定為 100
DataGridView1.Columns[0].MinimumWidth = 100;
// 第一行的最小行高設定為 50
DataGridView1.Rows[0].MinimumHeight = 50;
4) 禁止使用者改變行頭的寬度以及列頭的高度
// 禁止使用者改變列頭的高度
DataGridView1.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
// 設定使用者改變行頭的寬度
DataGridView1.RowHeadersWidthSizeMode =
DataGridViewRowHeadersWidthSizeMode.EnableResizing;
--------------------------------------------------------------------------------
⑧ DataGridView 列寬和行高自動調整的設定:
1) 設定行高和列寬自動調整
// 設定包括Header和所有單元格的列寬自動調整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// 設定包括Header和所有單元格的行高自動調整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
AutoSizeColumnsMode 屬性的設定值列舉請參照 msdn 的 DataGridViewAutoSizeRowsMode 說明。
2)指定列或行自動調整
// 第一列自動調整
DataGridView1.Columns[0].AutoSizeMode =
DataGridViewAutoSizeColumnMode.DisplayedCells;
AutoSizeMode 設定為 NotSet 時, 預設繼承的是 DataGridView.AutoSizeColumnsMode 屬性。
3) 設定列頭的高度和行頭的寬度自動調整
// 設定列頭的寬度可以自由調整
DataGridView1.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.AutoSize;
// 設定行頭的寬度可以自由調整
DataGridView1.RowHeadersWidthSizeMode =
DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
4) 隨時自動調整
a, 臨時的,讓列寬自動調整,這和指定AutoSizeColumnsMode屬性一樣。
// 讓 DataGridView1 的所有列寬自動調整一下。
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// 讓 DataGridView1 的第一列的列寬自動調整一下。
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells);上面呼叫的 AutoResizeColumns 和 AutoResizeColumn
當指定的是DataGridViewAutoSizeColumnMode.AllCells 的時候,引數可以省略。即:
DataGridView1.AutoResizeColumn(0) 和 DataGridView1.AutoResizeColumns()
b,臨時的,讓行高自動調整
// 讓 DataGridView1 的所有行高自動調整一下。
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);
//讓 DataGridView1 的第一行的行高自動調整一下。
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);上面呼叫的 AutoResizeRows 和 AutoResizeRow
當指定的是DataGridViewAutoSizeRowMode.AllCells 的時候,引數可以省略。即:DataGridView1.AutoResizeRow (0) 和 DataGridView1.AutoResizeRows()
c,臨時的,讓行頭和列頭自動調整
// 列頭高度自動調整
DataGridView1.AutoResizeColumnHeadersHeight();
// 行頭寬度自動調整
DataGridView1.AutoResizeRowHeadersWidth(
DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
關於效能:
通過 AutoSizeColumnsMode 或者 AutoSizeRowsMode 屬性所指定的單元格進行自動調整時,如果調整次數過於多那麼將可能導致效能下降,
尤其是在行和列數比較多的情況下。在這時用 DisplayedCells 代替 AllCells 能減少非所見的單元格的調整,從而提高效能。
--------------------------------------------------------------------------------
⑨ DataGridView 凍結列或行
1) 列凍結
DataGridViewColumn.Frozen 屬性為 True 時, 該列左側的所有列被固定, 橫向滾動時固定列不隨滾動條滾動而左右移動。這對於重要列固定顯示很有用。
// DataGridView1的左側2列固定
DataGridView1.Columns[1].Frozen = true;
但是,DataGridView.AllowUserToOrderColumns = True 時,固定列不能移動到非固定列, 反之亦然。
2) 行凍結
DataGridViewRow.Frozen 屬性為 True 時, 該行上面的所有行被固定, 縱向滾動時固定行不隨滾動條滾動而上下移動。
// DataGridView1 的上3行固定
DataGridView1.Rows[2].Frozen = true;
--------------------------------------------------------------------------------
⑩ DataGridView 列順序的調整
設定 DataGridView 的 AllowUserToOrderColumns 為 True 的時候, 使用者可以自由調整列的順序。
當用戶改變列的順序的時候,其本身的 Index 不會改變,但是 DisplayIndex 改變了。你也可以通過程式改變 DisplayIndex 來改變列的順序。 列順序發生改變時會引發 ColumnDisplayIndexChanged 事件:
// DataGridView1的ColumnDisplayIndexChanged事件處理方法
private void DataGridView1_ColumnDisplayIndexChanged(object sender,
DataGridViewColumnEventArgs e)
{
Console.WriteLine("{0} 的位置改變到 {1} ",
e.Column.Name, e.Column.DisplayIndex);
}
----------------
? 行頭列頭的單元格
[C#]
// 改變DataGridView1的第一列列頭內容
DataGridView1.Columns[0].HeaderCell.Value = "第一列";
// 改變DataGridView1的第一行行頭內容
DataGridView1.Rows[0].HeaderCell.Value = "第一行";
// 改變DataGridView1的左上頭部單元內容
DataGridView1.TopLeftHeaderCell.Value = "左上";
另外你也可以通過 HeaderText 來改變他們的內容。
[C#]
// 改變DataGridView1的第一列列頭內容
DataGridView1.Columns[0].HeaderText = "第一列";
? DataGridView 剪下板的操作
TOP
DataGridView.ClipboardCopyMode 屬性被設定為 DataGridViewClipboardCopyMode.Disable 以外的情況時,「Ctrl + C」 按下的時候,被選擇的單元格的內容會拷貝到系統剪下板內。格式有: Text, UnicodeText,Html, CommaSeparatedValue。可以直接貼上到 Excel 內。
ClipboardCopyMode 還可以設定 Header部分是否拷貝: EnableAlwaysIncludeHeaderText 拷貝Header部分、EnableWithoutHeaderText 則不拷貝。預設是 EnableWithAutoHeaderText , Header 如果選擇了的話,就拷貝。
1) 程式設計方式實現剪下板的拷貝
Clipboard.SetDataObject(DataGridView1.GetClipboardContent())
2) DataGridView 的資料貼上
實現剪下板的拷貝比較容易,但是實現 DataGridView 的直接貼上就比較難了。「Ctrl + V」按下進行貼上時,DataGridView 沒有提供方法,只能自己實現。
以下,是貼上時簡單的事例程式碼,將拷貝資料貼上到以選擇單元格開始的區域內。
[C#]
//當前單元格是否選擇的判斷
if (DataGridView1.CurrentCell == null)
return;
int insertRowIndex = DataGridView1.CurrentCell.RowIndex;
// 獲取剪下板的內容,並按行分割
string pasteText = Clipboard.GetText();
if (string.IsNullOrEmpty(pasteText))
return;
pasteText = pasteText.Replace(" ", " ");
pasteText = pasteText.Replace(' ', ' ');
pasteText.TrimEnd(new char[] { ' ' });
string[] lines = pasteText.Split(' ');
bool isHeader = true;
foreach (string line in lines)
{
// 是否是列頭
if (isHeader)
{
isHeader = false;
continue;
}
// 按 Tab 分割資料
string[] vals = line.Split(' ');
// 判斷列數是否統一
if (vals.Length - 1 != DataGridView1.ColumnCount)
throw new ApplicationException("貼上的列數不正確。");
DataGridViewRow row = DataGridView1.Rows[insertRowIndex];
// 行頭設定
row.HeaderCell.Value = vals[0];
// 單元格內容設定
for (int i = 0; i < row.Cells.Count; i++)
{
row.Cells[i].Value = vals[i + 1];
}
// DataGridView的行索引+1
insertRowIndex++;
}
________________________________________
? DataGridView 單元格的ToolTip的設定
DataGridView.ShowCellToolTips = True 的情況下, 單元格的 ToolTip 可以表示出來。對於單元格窄小,無法完全顯示的單元格, ToolTip 可以顯示必要的資訊。
1) 設定單元格的ToolTip內容
[C#]
// 設定單元格的ToolTip內容
DataGridView1[0, 0].ToolTipText = "該單元格的內容不能修改";
// 設定列頭的單元格的ToolTip內容
DataGridView1.Columns[0].ToolTipText = "該列只能輸入數字";
// 設定行頭的單元格的ToolTip內容
DataGridView1.Rows[0].HeaderCell.ToolTipText = "該行單元格內容不能修改";
2) CellToolTipTextNeeded 事件
在批量的單元格的 ToolTip 設定的時候,一個一個指定那麼設定的效率比較低, 這時候可以利用 CellToolTipTextNeeded 事件。當單元格的 ToolTipText 變化的時候也會引發該事件。但是,當DataGridView的DataSource被指定且VirualMode=True的時候,該事件不會被引發。
[C#]
// CellToolTipTextNeeded事件處理方法
private void DataGridView1_CellToolTipTextNeeded(object sender,
DataGridViewCellToolTipTextNeededEventArgs e)
{
e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString();
}
________________________________________
? DataGridView 的右鍵選單(ContextMenuStrip)
DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell 有 ContextMenuStrip 屬性。可以通過設定 ContextMenuStrip 物件來控制 DataGridView 的右鍵選單的顯示。 DataGridViewColumn 的 ContextMenuStrip 屬性設定了 除了列頭以外的單元格的右鍵選單。 DataGridViewRow 的 ContextMenuStrip 屬性設定了除了行頭以外的單元格的右鍵選單。DataGridViewCell 的 ContextMenuStrip 屬性設定了指定單元格的右鍵選單。
[C#]
// DataGridView 的 ContextMenuStrip 設定
DataGridView1.ContextMenuStrip = this.ContextMenuStrip1;
// 列的 ContextMenuStrip 設定
DataGridView1.Columns[0].ContextMenuStrip = this.ContextMenuStrip2;
// 列頭的 ContextMenuStrip 設定
DataGridView1.Columns[0].HeaderCell.ContextMenuStrip = this.ContextMenuStrip2;
// 行的 ContextMenuStrip 設定
DataGridView1.Rows[0].ContextMenuStrip = this.ContextMenuStrip3;
// 單元格的 ContextMenuStrip 設定
DataGridView1[0, 0].ContextMenuStrip = this.ContextMenuStrip4;
對於單元格上的右鍵選單的設定,優先順序是: Cell > Row > Column > DataGridView
? CellContextMenuStripNeeded、RowContextMenuStripNeeded 事件
利用 CellContextMenuStripNeeded 事件可以設定單元格的右鍵選單,尤其但需要右鍵選單根據單元格值的變化而變化的時候。比起 使用迴圈遍歷,使用該事件來設定右鍵選單的效率更高。但是,在DataGridView使用了DataSource繫結而且是VirtualMode的時 候,該事件將不被引發。
[C#]
// CellContextMenuStripNeeded事件處理方法
private void DataGridView1_CellContextMenuStripNeeded(object sender,
DataGridViewCellContextMenuStripNeededEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
if (e.RowIndex < 0)
{
// 列頭的ContextMenuStrip設定
e.ContextMenuStrip = this.ContextMenuStrip1;
}
else if (e.ColumnIndex < 0)
{
// 行頭的ContextMenuStrip設定
e.ContextMenuStrip = this.ContextMenuStrip2;
}
else if (dgv[e.ColumnIndex, e.RowIndex].Value is int)
{
// 如果單元格值是整數時
e.ContextMenuStrip = this.ContextMenuStrip3;
}
}
同樣,可以通過 RowContextMenuStripNeeded 事件來設定行的右鍵選單。
[C#]
// RowContextMenuStripNeeded事件處理方法
private void DataGridView1_RowContextMenuStripNeeded(object sender,
DataGridViewRowContextMenuStripNeededEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
// 當"Column1"列是Bool型且為True時、設定其的ContextMenuStrip
object boolVal = dgv["Column1", e.RowIndex].Value;
Console.WriteLine(boolVal);
if (boolVal is bool && (bool)boolVal)
{
e.ContextMenuStrip = this.ContextMenuStrip1;
}
}
CellContextMenuStripNeeded 事件處理方法的引數中、 「e.ColumnIndex=-1」表示行頭、「e.RowIndex=-1」表示列頭。RowContextMenuStripNeeded則不存在 「e.RowIndex=-1」的情況。
________________________________________
? DataGridView 的單元格的邊框、 網格線樣式的設定
1) DataGridView 的邊框線樣式的設定
DataGridView 的邊框線的樣式是通過 DataGridView.BorderStyle 屬性來設定的。 BorderStyle 屬性設定值是一個
BorderStyle 列舉: FixedSingle(單線,預設)、Fixed3D、None。
2) 單元格的邊框線樣式的設定
單元格的邊框線的樣式是通過 DataGridView.CellBorderStyle 屬性來設定的。 CellBorderStyle 屬性設定值是
DataGridViewCellBorderStyle 列舉。(詳細參見 MSDN)
另外,通過 DataGridView.ColumnHeadersBorderStyle 和 RowHeadersBorderStyle 屬性可以修改 DataGridView 的頭部的單元格邊框線樣式。 屬性設定值是 DataGridViewHeaderBorderStyle 列舉。(詳細參見 MSDN)
3) 單元格的邊框顏色的設定
單元格的邊框線的顏色可以通過 DataGridView.GridColor 屬性來設定的。預設是 ControlDarkDark 。但是隻有在 CellBorderStyle 被設定為 Single、SingleHorizontal、SingleVertical 的條件下才能改變其邊框線的顏色。同樣,ColumnHeadersBorderStyle 以及 RowHeadersBorderStyle 只有在被設定為 Single 時,才能改變顏色。
4) 單元格的上下左右的邊框線式樣的單獨設定
CellBorderStyle只能設定單元格全部邊框線的式樣。要單獨改變單元格某一邊邊框式樣的話,需要用到DataGridView.AdvancedCellBorderStyle屬性。如示例:
[VB.NET]
' 單元格的上邊和左邊線設為二重線
' 單元格的下邊和右邊線設為單重線
DataGridView1.AdvancedCellBorderStyle.Top = _
DataGridViewAdvancedCellBorderStyle.InsetDouble
DataGridView1.AdvancedCellBorderStyle.Right = _
DataGridViewAdvancedCellBorderStyle.Inset
DataGridView1.AdvancedCellBorderStyle.Bottom = _
DataGridViewAdvancedCellBorderStyle.Inset
DataGridView1.AdvancedCellBorderStyle.Left = _
DataGridViewAdvancedCellBorderStyle.InsetDouble
同樣,設定行頭單元格的屬性是: AdvancedRowHeadersBorderStyle, 設定列頭單元格屬性是:AdvancedColumnHeadersBorderStyle。
________________________________________
? DataGridView 單元格表示值的自定義
通過CellFormatting事件,可以自定義單元格的表示值。(比如:值為Error的時候,單元格被設定為紅色)
下面的示例:將“Colmn1”列的值改為大寫。
[C#]
//CellFormatting 事件處理方法
private void DataGridView1_CellFormatting(object sender,
DataGridViewCellFormattingEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
// 如果單元格是“Column1”列的單元格
if (dgv.Columns[e.ColumnIndex].Name == "Column1" && e.Value is string)
{
// 將單元格值改為大寫
string str = e.Value.ToString();
e.Value = str.ToUpper();
// 應用該Format,Format完畢。
e.FormattingApplied = true;
}
}
CellFormatting事件的DataGridViewCellFormattingEventArgs物件 的Value屬性一開始儲存著未被格式化的值。當Value屬性被設定表示用的文字之後,把FormattingApplied屬性做為True,告知 DataGridView文字已經格式化完畢。如果不這樣做的話,DataGridView會根據已經設定的 Format,NullValue,DataSourceNullValue,FormatProvider屬性會將Value屬性會被重新格式化一遍。
________________________________________
? DataGridView 使用者輸入時,單元格輸入值的設定
通過 DataGridView.CellParsing 事件可以設定使用者輸入的值。下面的示例:當輸入英文文字內容的時候,立即被改變為大寫。
[C#]
//CellParsing 事件處理方法
private void DataGridView1_CellParsing(object sender,
DataGridViewCellParsingEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
//單元格列為“Column1”時
if (dgv.Columns[e.ColumnIndex].Name == "Column1" &&
e.DesiredType == typeof(string))
{
//將單元格值設為大寫
e.Value = e.Value.ToString().ToUpper();
//解析完畢
e.ParsingApplied = true;
}
}
________________________________________
? DataGridView 新加行的預設值的設定
需要指定新加行的預設值的時候,可以在DataGridView.DefaultValuesNeeded事件裡處理。在該事件中處理除了可以設定預設值以外,還可以指定某些特定的單元格的ReadOnly屬性等。
[C#]
// DefaultValuesNeeded 事件處理方法
private void DataGridView1_DefaultValuesNeeded(object sender,
DataGridViewRowEventArgs e)
{
// 設定單元格的預設值
e.Row.Cells["Column1"].Value = 0;
e.Row.Cells["Column2"].Value = "-";
}
4、combobox
combobox繫結資料的方法:datasource/items.add()
當以datasource方法新增時,獲取選中項的方法為selectedvalue.tostring()
當以items.add()方法新增時,獲取選中項的方法為selecteditem.tostring()
當datatable中包含很多列的值,而你只需顯示其中一列,設定如下:(顯示的為name列的值,但選中後對應的後臺值為id列的值)
combobox.DataSource = dt;//設定資料來源
combobox.DisplayMember = "Name";//設定顯示列
combobox.ValueMember = "ID";//設定實際值
combobox.SelectedIndexChanged += new EventHandler(combobox_SelectedIndexChanged);
5、DataGridVIew
(1)設定背景顏色
C#中可以根據每行內容的不同來對DataGridView資料表格控制元件每行的文字顏色、背景顏色進行不同的設定。實現思路:在DataGridView的RowPrePaint事件中進行行顏色控制。實現程式碼如下:
private void dataGridViewX1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) { int callType = Convert.ToInt32(dataGridViewX1.Rows[e.RowIndex].Cells["LDT_callType"].Value); switch (callType) { case -1://未接 dataGridViewX1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Red; break; case 0://已接 dataGridViewX1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Green; break; case 1://打出 dataGridViewX1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Blue; break; } }如果需要對行的背景色進行控制,將ForeColor改為BackColor即可。
(2)設定CheckBox的點選事件,並將此事件應用於CellClick上
//獲取CheckBox的選擇狀態,根據狀態設定值
if ((bool)dgv_not.Rows[e.RowIndex].Cells[0].EditedFormattedValue == true)
{
dgv_not.Rows[e.RowIndex].Cells[0].Value = 0;
}
else
{
dgv_not.Rows[e.RowIndex].Cells[0].Value = 1;
}
(3)當datagridview行的內容狀態發生變化時的事件可以寫在CellValueChanged的事件中
(4)分頁設定
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 // 1、定義幾個所需的公有成員:
int pageSize = 0; //每頁顯示行數
int nMax = 0; //總記錄數
int pageCount = 0; //頁數=總記錄數/每頁顯示行數
int pageCurrent = 0; //當前頁號
int nCurrent = 0; //當前記錄行
DataSet ds = new DataSet();
DataTable dtInfo = new DataTable();
//2、在窗體載入事件中,從資料來源讀取記錄到DataTable中:
string strConn = "SERVER=127.0.0.1;DATABASE=NORTHWIND;UID=SA;PWD=ULTRATEL"; //資料庫連線字串
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
string strSql = "SELECT * FROM CUSTOMERS";
SqlDataAdapter sda = new SqlDataAdapter(strSql,conn);
sda.Fill(ds,"ds");
conn.Close();
dtInfo = ds.Tables[0];
InitDataSet();
//3、用當前頁面資料填充DataGridView
private void InitDataSet()
{
pageSize = 20; //設定頁面行數
nMax = dtInfo.Rows.Count;
pageCount=(nMax/pageSize); //計算出總頁數
if ((nMax % pageSize) > 0) pageCount++;
pageCurrent = 1; //當前頁數從1開始
nCurrent = 0; //當前記錄數從0開始
LoadData();
}
private void LoadData()
{
int nStartPos = 0; //當前頁面開始記錄行
int nEndPos = 0; //當前頁面結束記錄行
DataTable dtTemp = dtInfo.Clone(); //克隆DataTable結構框架
if (pageCurrent == pageCount)
{
nEndPos = nMax;
}
else
{
nEndPos = pageSize * pageCurrent;
}
nStartPos = nCurrent;
lblPageCount.Text = pageCount.ToString();
txtCurrentPage.Text = Convert.ToString(pageCurrent);
//從元資料來源複製記錄行
for (int i = nStartPos; i < nEndPos; i++)
{
dtTemp.ImportRow(dtInfo.Rows[i]);
nCurrent++;
}
bdsInfo.DataSource = dtTemp;
bdnInfo.BindingSource = bdsInfo;
dgvInfo.DataSource = bdsInfo;
}
// 4、選單響應事件:
private void bdnInfo_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.Text == "關閉")
{
this.Close();
}
if (e.ClickedItem.Text == "上一頁")
{
pageCurrent--;
if (pageCurrent <= 0)
{
MessageBox.Show("已經是第一頁,請點選“下一頁”檢視!");
return;
}
else
{
nCurrent = pageSize * (pageCurrent - 1);
}
LoadData();
}
if (e.ClickedItem.Text == "下一頁")
{
pageCurrent++;
if (pageCurrent > pageCount)
{
MessageBox.Show("已經是最後一頁,請點選“上一頁”檢視!");
return;
}
else
{
nCurrent=pageSize*(pageCurrent-1);
}
LoadData();
}
}
6、窗體form的一些屬性配置
將winform窗體的大小固定住,不能調整其大小的方法:窗體FormBorderStyle屬性設定為:FixedSingle,再把最大化禁用就可以了
1、讓窗體在啟動時在指定位置出現
form1.StartPosition
Manual
CenterScreen
WindowsDefaultLocation (default)
WindowsDefaultBounds
CenterParent // 父窗體的中間
只有在窗體啟動前設定才有效。
2、設定窗體的圖示
form1.Icon
3、設定該窗體成為多個子窗體的父窗體
form1.isMidContainer = true / false(default)
在設計時使用,一個專案中只能有一個父窗體。
4、指定最大化、最小化按鈕的行為
form1.ControlBox = true(default) / false /// 設定是否出現最大化、最小化和關閉按鈕
form1.MaxmizeBox = true(default) / false /// 設定最大化按鈕是否有效
form1.MinimizeBox = true(default) / false /// 設定最小化按鈕是否有效
如果當ControlBox = true MaxmizeBox = false MinimizeBox = false 而 HelpButton = true 時
就可以看到有個幫助的按鈕出現在關閉按鈕旁邊。
5、窗體如果想顯示普通選單那麼需要新增選單控制元件MainMenu
form1.Menu 選項用於指定使用那個選單。
如果想動態載入選單就先準備好要用的幾個MainMenu控制元件,然後到適當時機在執行時改變form1.Menu 的值。
如果要使用快捷選單,就像窗體中新增ContextMenu控制元件。然後指定form1.ContextMenu 為這個控制元件。
6、設定窗體的透明度
form1.Opacity
它的值是一個百分數,範圍是0~100%,當它等於0時整個窗體就不可見隱藏起來了。當他等於100%時,這個窗體就是個普通窗體。
7、設定是否在工作列中顯示窗體
form1.ShowInTaskbar = true(default) / false
預設值是true, 當他設定為false時就從工作列消失了。通常可以配合NotifyIcon來實現將程式隱藏到系統右下角的系統狀態列。
8、設定是否顯示窗體右下角調整大小的手柄
form1.SizeGripStyle = Auto(default) / Show /Hide
預設值為Auto,那麼它會根據窗體的顯示樣式來決定是否顯示這個手柄。例如:當窗體設定為對不能調節大小的話框時,這個手柄就不會出現。
9、設定窗體在最前端現實,例如一些播放器和聊天軟體,他們通常都在所有窗體的上面。
form1.TopMost = true / false(default)
10、設定窗體部分透明
form1.Transparencykey
它接受一個顏色值,當窗體中有顏色和這個設定顏色一致時,系統將這些顏色的區域設為透明。
11、設定窗體背景圖片 <