在 C# 開發過程中,開發者常會遇到各種實務問題:如何自訂 DataGrid 欄位標題、如何處理資料庫空值查詢、如何讓 TextBox 接收 Enter 鍵、Oracle 與 SQL Server 資料類型對照、存儲過程中 LIKE 語句寫法、日期格式化、資料匯出 Excel 等。本文彙整 21 個常見開發場景,提供可直接套用的程式碼片段與解決方案,助你快速解決開發難題。
透過 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);
在 SQL 查詢中直接格式化,避免前端再處理:
-- SQL Server
SELECT CONVERT(varchar(10), 日期欄位, 120) AS 格式化日期 FROM 表名
-- Oracle
SELECT TO_CHAR(日期欄位, 'YYYY-MM-DD') AS 格式化日期 FROM 表名
當滑鼠滾輪捲動超出範圍時 DataGrid 會失去焦點,解決方法:
this.dataGrid1.MouseWheel += new MouseEventHandler(dataGrid1_MouseWheel);
private void dataGrid1_MouseWheel(object sender, MouseEventArgs e)
{
this.dataGrid1.Select(); // 強制取回焦點
}
在子表手動新增計算欄位,透過 Expression 關聯母表:
DataColumn dc = new DataColumn("newCol", typeof(string));
dc.Expression = "Parent.parentColumnName"; // 關聯母表欄位
dt.Columns.Add(dc); // dt 為子表 DataTable
直接在 SQL 層面處理,效能最佳:
-- SQL Server
SELECT SUBSTRING(欄位名, 起始位置, 長度) AS 別名 FROM 表名
-- Oracle
SELECT SUBSTR(欄位名, 起始位置, 長度) AS 別名 FROM 表名
SELECT * FROM 表名 WHERE 欄位名 IS NULL
使用 NUMERIC(15) 或 DECIMAL(15) 即可。
CREATE PROCEDURE usp_Search
@hao NVARCHAR(50)
AS
BEGIN
SELECT * FROM mytable WHERE haoma LIKE '%' + @hao + '%'
END
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
適用於 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
設定 Form 的 AcceptButton 屬性指向該按鈕。
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)13) // Enter 鍵
{
// 執行邏輯
e.Handled = true; // 標記已處理
}
}
設定 DropDownStyle = DropDownList:
this.WindowState = FormWindowState.Maximized;
| 平台 | 語法 |
|---|---|
| C# | DateTime.Now |
| SQL Server | GETDATE() |
| Oracle | SYSDATE |
// 存取第 row 行、第 col 列
object value = dataGrid[row, col];
int count = dt.Select("城市 = '延吉'").Length;
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '+')
{
SendKeys.Send("A");
e.Handled = true;
}
}
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;
}
// 取得自訂標題
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;
}
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 回傳 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 物件需正確釋放)。掌握這些細節,能大幅提升開發效率與程式碼品質。