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

C# 開發實用技巧 33 則:DataGrid、WinForms、資料庫、Excel、安裝部署完全指南

     編輯:關於C語言

前言

本文彙整 33 個 C# 開發常見問題與解決方案,涵蓋 DataGrid 自訂、WinForms 控制技巧、ADO.NET/SQL 技巧、Excel 匯出、安裝部署、跨表單傳值等實務主題,每則附程式碼可直接參考套用。

DataGrid 相關技巧 (1-10)

  1. 自訂欄標題:使用 DataGridTableStyle + DataGridTextBoxColumn 設定 MappingName 與 HeaderText。
  2. 查詢 NULL 欄位:SQL 使用 WHERE col IS NULL。
  3. 接收 Enter 鍵:表單設定 AcceptButton 屬性,或在 KeyPress 事件判斷 e.KeyChar == (char)13。
  4. Oracle NUMBER(15) 對應:SQL Server 使用 numeric(15) 或 decimal(15,0)。
  5. LIKE 參數化存儲程序:WHERE col LIKE '%' + @param + '%'。
  6. TextBox 接收 Enter (無按鈕):KeyPress 事件處理 e.KeyChar == 13。
  7. ExecuteScalar 轉 Int32:int val = int.Parse(cmd.ExecuteScalar().ToString())。
  8. DataGrid 顯示父表欄位:子表加入 DataColumn,Expression = "Parent.ParentCol"。
  9. 截取字串顯示:SQL 使用 SUBSTRING(col, start, len) 或 Oracle SUBSTR。
  10. ComboBox 唯讀下拉:DropDownStyle = DropDownList。

日期、格式與資料操作 (11-20)

  1. DataGrid 日期只顯示年月日:SQL CONVERT(varchar(10), date, 120) 或 FORMAT(date, 'yyyy-MM-dd')。
  2. 合併兩欄為一欄:DataColumn.Expression = "Col1 + Col2" (SQL Server) / "Col1 || Col2" (Oracle)。
  3. 擷取括號內文字:Oracle CASE WHEN col LIKE '%(%' THEN SUBSTR(col, INSTR(col,'(')+1, INSTR(col,')')-INSTR(col,'(')-1) END。
  4. DataGrid 滾輪失焦:MouseWheel += (s,e)=> dataGrid.Select();。
  5. 按鍵替換 (+ → A):KeyPress 事件 SendKeys.Send("A"); e.Handled=true;。
  6. 啟動最大化:WindowState = FormWindowState.Maximized。
  7. 取得現在時間:C# DateTime.Now,SQL Server GETDATE()。
  8. DataGrid 存取儲存格:dataGrid[row, col] (索引器)。
  9. DataTable 統計特定值筆數:dt.Select("City='Taipei'").Length。
  10. Excel 匯出保留前導零:range.NumberFormat = "0000"。

Excel 匯出進階 (21)

// 完整匯出範本:含自訂標題、邊框、置中、分頁列印標題、頁碼
private void ExportToExcel(DataSet ds)
{
    Excel.Application excel = new Excel.Application();
    excel.Workbooks.Add(true);
    Excel._Worksheet ws = (Excel._Worksheet)excel.ActiveSheet;

    DataTable dt = ds.Tables["table"];
    int r = 1, c = 1;

    // 標題列 (使用 TableStyle 自訂標題)
    foreach (DataGridColumnStyle colStyle in dataGrid1.TableStyles[0].GridColumnStyles)
        ws.Cells[r, c++] = colStyle.HeaderText;

    // 資料列
    foreach (DataRow row in dt.Rows)
    {
        c = 1; r++;
        foreach (DataColumn col in dt.Columns)
            ws.Cells[r, c++] = row[col];
    }

    // 邊框
    Excel.Range rng = ws.get_Range(ws.Cells[1,1], ws.Cells[dt.Rows.Count+1, dt.Columns.Count]);
    rng.Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous;
    rng.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
    rng.Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;

    // 指定欄置中
    ws.Columns[3].HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;

    // 每頁列印標題列
    ws.PageSetup.PrintTitleRows = "$1:$1";
    // 頁腳頁碼
    ws.PageSetup.CenterFooter = "第 &P 頁 / 共 &N 頁";

    excel.Visible = true;
}

UI 更新與進度顯示 (22)

// 長時間迴圈中更新 UI 需呼叫 DoEvents
dataGrid1.CaptionText = $"匯出中: {current}/{total}";
Application.DoEvents(); // 處理訊息佇列,讓 UI 重繪

Flash 呼叫外部程式 (23)

// Flash ActionScript
fscommand("exec", "MyApp.exe");
// 需發布為 .exe,並在同目錄建立 fscommand 資料夾放入 MyApp.exe

DataGrid 程式化捲動 (24)

dataGrid1.Select();
SendKeys.Send("{PGUP}");   // 上一頁
SendKeys.Send("{PGDN}");   // 下一頁
SendKeys.Send("^{LEFT}");  // Ctrl+左
SendKeys.Send("^{RIGHT}"); // Ctrl+右

主從 DataGrid 綁定 (25)

dataGrid1.DataSource = ds; dataGrid1.DataMember = "ParentTable";
dataGrid2.DataSource = ds; dataGrid2.DataMember = "ParentTable.RelationName";

組件版本自動產生 (26)

// AssemblyInfo.cs
[assembly: AssemblyVersion("1.0.*")] // Build = 從 2000/1/1 起的天數, Revision = 秒數/2

建立強名稱共用組件 (27)

sn -k key.snk
// AssemblyInfo.cs: [assembly: AssemblyKeyFile("..\\..\\key.snk")]
// 編譯 DLL → gacutil /i MyLib.dll

Oracle 查詢首字母 A-Z (28)

SELECT * FROM tbl WHERE ASCII(SUBSTR(col,1,1)) BETWEEN ASCII('A') AND ASCII('Z')

取得目前組件版本 (29)

var fvi = FileVersionInfo.GetVersionInfo(Process.GetCurrentProcess().MainModule.FileName);
Console.WriteLine(fvi.FileVersion);

建立簡單安裝專案 (30)

  1. 新增「安裝精靈」專案
  2. 選擇「主輸出」
  3. 建置 → 產生 Setup.exe、.msi

安裝時自動建立資料表 (31)

  1. 新增「安裝程式類別」 MyInstaller
  2. SSMS 產生建表 Script (移除 GO) → 加入專案為「內嵌資源」
  3. Override Install() 讀取資源執行 SQL
  4. 安裝專案「自訂動作」→「安裝」加入主輸出

TreeView 顯示多層父子關係 (32)

// 三層遞迴綁定
foreach (DataRow r1 in ds.Tables["A1"].Rows)
{
    TreeNode n1 = tree.Nodes.Add(r1["Name"].ToString());
    foreach (DataRow r2 in r1.GetChildRows("A1A2"))
    {
        TreeNode n2 = n1.Nodes.Add(r2["Name"].ToString());
        foreach (DataRow r3 in r2.GetChildRows("A2A3"))
            n2.Nodes.Add(r3["Name"].ToString());
    }
}

跨表單傳值 (33) - 委派模式

// Form2
public delegate void SendDataHandler(object sender);
public event SendDataHandler SendData;

private void btnOK_Click(object s, EventArgs e)
{
    SendData?.Invoke(txtInput);
    Close();
}

// Form1
Form2 f2 = new Form2();
f2.SendData += (sender) => txtResult.Text = ((TextBox)sender).Text;
f2.ShowDialog();

總結

這 33 個技巧涵蓋了 C# 開發中高頻遇到的問題,建議收藏備查。實務上應優先考慮現代框架(如 EF Core、ClosedXML、WPF/MVVM)替代部分傳統做法,但核心邏輯仍具參考價值。

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