首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 開發實用技巧大全(一):DataGrid、資料庫操作與 WinForm 控制

     編輯:關於C語言

前言

在 C# 開發過程中,開發者常會遇到各種實務問題:如何自訂 DataGrid 欄位標題、如何處理資料庫空值查詢、如何讓 TextBox 接收 Enter 鍵、Oracle 與 SQL Server 資料類型對照、存儲過程中 LIKE 語句寫法、日期格式化、資料匯出 Excel 等。本文彙整 21 個常見開發場景,提供可直接套用的程式碼片段與解決方案,助你快速解決開發難題。

一、DataGrid 進階操作

1. 自訂 DataGrid 欄位標題

透過 DataGridTableStyle 與 DataGridTextBoxColumn 即可實現欄位標題的客製化:

DataGridTableStyle dgts = new DataGridTableStyle();
dgts.MappingName = "myTable"; // 對應要載入的 DataTable

DataGridTextBoxColumn dgcs = new DataGridTextBoxColumn();
dgcs.MappingName = "title_id";
dgcs.HeaderText = "標題ID";
dgts.GridColumnStyles.Add(dgcs);
// ... 依此類推新增其他欄位

dataGrid1.TableStyles.Add(dgts);

2. 顯示日期僅保留年月日

在 SQL 查詢中直接格式化,避免前端再處理:

-- SQL Server
SELECT CONVERT(varchar(10), 日期欄位, 120) AS 格式化日期 FROM 表名

-- Oracle
SELECT TO_CHAR(日期欄位, 'YYYY-MM-DD') AS 格式化日期 FROM 表名

3. DataGrid 滾輪導致失焦問題

當滑鼠滾輪捲動超出範圍時 DataGrid 會失去焦點,解決方法:

this.dataGrid1.MouseWheel += new MouseEventHandler(dataGrid1_MouseWheel);

private void dataGrid1_MouseWheel(object sender, MouseEventArgs e)
{
    this.dataGrid1.Select(); // 強制取回焦點
}

4. 子表 DataGrid 顯示母表欄位

在子表手動新增計算欄位,透過 Expression 關聯母表:

DataColumn dc = new DataColumn("newCol", typeof(string));
dc.Expression = "Parent.parentColumnName"; // 關聯母表欄位
dt.Columns.Add(dc); // dt 為子表 DataTable

5. DataGrid 部分資料顯示(字串截取)

直接在 SQL 層面處理,效能最佳:

-- SQL Server
SELECT SUBSTRING(欄位名, 起始位置, 長度) AS 別名 FROM 表名

-- Oracle
SELECT SUBSTR(欄位名, 起始位置, 長度) AS 別名 FROM 表名

二、資料庫操作技巧

6. 查詢欄位為 NULL 的記錄

SELECT * FROM 表名 WHERE 欄位名 IS NULL

7. Oracle NUMBER(15) 對應 SQL Server 型別

使用 NUMERIC(15) 或 DECIMAL(15) 即可。

8. 存儲過程中使用 LIKE 模糊查詢

CREATE PROCEDURE usp_Search
    @hao NVARCHAR(50)
AS
BEGIN
    SELECT * FROM mytable WHERE haoma LIKE '%' + @hao + '%'
END

9. 合併兩個欄位成一個欄位填入 DataSet

DataTable 層面:

DataColumn dc = new DataColumn("newColumnName", typeof(string));
dc.Expression = "columnName1 + columnName2";
dt.Columns.Add(dc);

SQL 層面(效能更好):

-- Oracle
SELECT col1 || col2 AS merged_col FROM table

-- SQL Server
SELECT col1 + col2 AS merged_col FROM table

10. 從合併欄位擷取括號內文字

適用於 Oracle:

SELECT COL1, COL2,
    CASE
        WHEN COL3 LIKE '%(%' THEN
            SUBSTR(COL3, INSTR(COL3, '(') + 1, INSTR(COL3, ')') - INSTR(COL3, '(') - 1)
    END AS COL3
FROM MY_TABLE

三、WinForm 控制項技巧

11. 接收 Enter 鍵(有按鈕時)

設定 Form 的 AcceptButton 屬性指向該按鈕。

12. TextBox 接收 Enter 鍵(無按鈕時)

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)13) // Enter 鍵
    {
        // 執行邏輯
        e.Handled = true; // 標記已處理
    }
}

13. ComboBox 僅允許選擇,不可輸入

設定 DropDownStyle = DropDownList:

  • DropDown:文字可編輯,需點擊箭頭顯示清單
  • DropDownList:文字不可編輯,只能選擇(推薦)
  • Simple:文字可編輯,清單永遠可見

14. Form 啟動時最大化

this.WindowState = FormWindowState.Maximized;

15. 取得目前日期時間

平台語法
C#DateTime.Now
SQL ServerGETDATE()
OracleSYSDATE

16. 存取 DataGrid 指定儲存格

// 存取第 row 行、第 col 列
object value = dataGrid[row, col];

17. DataTable 統計特定值筆數

int count = dt.Select("城市 = '延吉'").Length;

18. 變更鍵盤輸入字符(如 '+' → 'A')

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '+')
    {
        SendKeys.Send("A");
        e.Handled = true;
    }
}

四、DataGrid 匯出 Excel 完整方案

19. 基本匯出程式碼

private void btnExport_Click(object sender, EventArgs e)
{
    Excel.Application excel = new Excel.ApplicationClass();
    excel.Workbooks.Add(true);
    
    DataTable dt = ds.Tables["table"];
    int rowIdx = 1, colIdx = 1;
    
    // 寫入標題列
    foreach (DataColumn dc in dt.Columns)
    {
        excel.Cells[rowIdx, colIdx++] = dc.ColumnName;
    }
    
    // 寫入資料列
    foreach (DataRow dr in dt.Rows)
    {
        colIdx = 1;
        rowIdx++;
        foreach (DataColumn dc in dt.Columns)
        {
            excel.Cells[rowIdx, colIdx++] = dr[dc];
        }
    }
    
    excel.Visible = true;
}

20. 套用自訂 TableStyle 的標題與欄位順序

// 取得自訂標題
for (int i = 0; i < dataGrid1.TableStyles[0].GridColumnStyles.Count; i++)
{
    string header = dataGrid1.TableStyles[0].GridColumnStyles[i].HeaderText;
    excel.Cells[1, i + 1] = header;
}

21. 設定邊框、置中、列印標題重複、頁碼

Excel.Worksheet ws = (Excel.Worksheet)excel.ActiveSheet;
Excel.Range range = ws.get_Range(ws.Cells[1, 1], ws.Cells[dt.Rows.Count + 1, dt.Columns.Count]);

// 邊框
range.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Type.Missing);
range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin;
range.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
range.Borders[Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin;

// 指定欄置中(例如第 3 欄)
range.Columns[3].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

// 列印時每頁重複標題列
ws.PageSetup.PrintTitleRows = "$1:$1";

// 頁腳顯示「第 N 頁 / 共 M 頁」
ws.PageSetup.CenterFooter = "第&;P頁 / 共&;N頁";

// 保留前導零(如 0212 不變 212)
range.Columns[1].NumberFormat = "0000"; // 依欄位調整格式

五、ExecuteScalar 轉換陷阱

ExecuteScalar 回傳 object,直接轉 Int32 會失敗,正確寫法:

// 錯誤
// int id = (Int32)cmd.ExecuteScalar(); 

// 正確
int id = Convert.ToInt32(cmd.ExecuteScalar());
// 或
int id = Int32.Parse(cmd.ExecuteScalar().ToString());

總結

本文涵蓋 DataGrid 客製化、資料庫跨平台語法差異、WinForm 事件處理、Excel 匯出進階設定等 21 個實戰技巧。建議開發者根據專案需求挑選適用方案,並在實作時注意例外處理與資源釋放(如 Excel COM 物件需正確釋放)。掌握這些細節,能大幅提升開發效率與程式碼品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved