1. 程式人生 > >c# 一些控制元件使用方法

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、設定窗體背景圖片 <