GridView 模板欄位中的 DropDownList 觸發 SelectedIndexChanged 時,**無法像 Button 那樣設定 CommandName/CommandArgument** 直接取得列索引。
NamingContainer每個伺服器控制項的 NamingContainer 屬性指向**實作 INamingContainer 的最近父控制項**(對 GridView 而言即 GridViewRow)。
protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddl = (DropDownList)sender;
// 關鍵:透過 NamingContainer 取得包含此 DDL 的 GridViewRow
GridViewRow row = (GridViewRow)ddl.NamingContainer;
int rowIndex = row.RowIndex; // 列索引
int dataKey = Convert.ToInt32(GridView1.DataKeys[rowIndex].Value); // 主鍵值
string selected = ddl.SelectedValue; // 使用者選擇的值
// 後續業務邏輯...
}
GridViewRow,實作 INamingContainer,建立唯一命名範圍,確保同 ID 控制項在不同列不衝突。NamingContainer 直接回傳該命名範圍的建立者,即該列的 GridViewRow 實例。| 方法 | 優點 | 缺點 |
|---|---|---|
| NamingContainer | 簡潔、無需額外屬性、效能佳 | 需理解命名容器概念 |
RowDataBound 綁定 CommandArgument | 直觀 | DropDownList 無 CommandArgument 屬性 |
| 隱藏欄位存 RowIndex | 通用 | 增加標記、需額外 FindControl |