錯誤堆疊指向 `CellClick` 事件中 `ds.Tables[0].Rows[0]["病案號"].ToString()`。兩大可能:DataTable 無行、列名大小寫/空格不匹配。
| 現象 | 原因 | 修正 |
|---|---|---|
| `Rows.Count == 0` | SQL 查無數據 / 參數錯誤 | 點擊前判斷 `if (ds.Tables[0].Rows.Count > 0)` |
| 列名實為 `病案号`(简体) | 資料庫列名與代碼不一致 | 用 `Columns["病案号"]` 或 `Columns[0]` 索引 |
| 值為 `DBNull.Value` | 字段允許 NULL | `Convert.ToString(row["病案號"])` 安全處理 |
| 多表查詢導致列名重複 | 未起別名 | SQL 用 `AS` 別名:`SELECT t1.病案號 AS case_no ...` |
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e) {
if (e.RowIndex < 0) return; // 標題行
var row = dataGridView.Rows[e.RowIndex];
var cell = row.Cells["病案號"]; // 建議用 DataPropertyName 綁定列名
string caseNo = cell?.Value?.ToString() ?? "";
if (string.IsNullOrEmpty(caseNo)) return;
// 後續業務...
}
**核心原則**:UI 事件處理器要**防禦性編程**,假設數據隨時可能為空、類型不符、結構變化。