2011-05-05 80 views

回答

4

沒有直接的方法將GridView列設置爲只讀。但是,您可以將控件設置爲GridViewRowDataBound事件中該列的只讀。例如

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == DataControlRowState.Alternate) 
    { 
     TextBox txt = (TextBox)e.Row.FindControl("ControlID"); 
     txt.ReadOnly = true; 
    } 
} 
+0

當我嘗試這個,我得到編譯器錯誤消息:CS0123:沒有重載'grdProducts_RowDataBound'匹配委託'System.EventHandler' – BillTetrault 2011-05-05 13:09:56

+0

替換此行----保護無效grdProducts_RowDataBound(對象發件人,GridViewRowEventArgs e) – 2011-05-05 13:13:13

+0

我認爲問題時,您定義事件句柄,只需從我的答wer – 2011-05-05 13:14:18

0

是的,點擊ItemDataBound事件,併爲每一行使用只讀控件和編輯控件,並顯示/隱藏作業的右側控件,或者禁用編輯控件。模板沒有全局只讀設置。

HTH。

5

我發現穆罕默德·阿赫塔爾的答案几乎是當場就除了我需要稍微修改條款,如果在我的情況下,以覆蓋所有的條件。我的if條款如下。

if ((e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit || 
    (e.Row.RowState & DataControlRowState.Alternate) == DataControlRowState.Alternate) 

,直到我有e.Row.RowState特殊值我沒有找到與原來的任何問題「備用|編輯」,這使得

(e.Row.RowState == DataControlRowState.Edit || 
e.Row.RowState == DataControlRowState.Alternate) == false 

不過,我要感謝穆罕默德·阿赫塔爾爲指着我走向正確的方向。

這裏是我的完整代碼:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if ((e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit || (e.Row.RowState & DataControlRowState.Alternate) == DataControlRowState.Alternate) 
    { 
     TextBox txt = (TextBox)e.Row.FindControl("ControlID"); 
     txt.ReadOnly = true; 
    } 
} 

PS:爲了讓DropDownList的只讀,你需要在它的OnDataBound事件來禁用它:

protected void DropDownList1_DataBound(object sender, EventArgs e) 
{ 
    ((DropDownList)sender).Enabled = false; 
}