2011-05-05 82 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; 
}