Gridview & DetailView

 一.GridView
I).RowCommand中,我们常常根据CommandName和行的主键ID来决定执行的操作及操作的对象.
1).若CommandButton所在非模板列,则GridViewRow=e.CommandSource,否则(在模板列中)如下:
        Dim gvRow As GridViewRow = CType(e.CommandSource, Control).NamingContainer
2).第一个cell的文本内容:
        gvrow.Cells (0).Text
3).查找Row内的控件:
       gvrow.FindControl ("imgFinished")
4).所在行的主键值:
       GridView1.DataKeys(gvRow.RowIndex).Value
☆总结:
RowComand中我们无法根据DataItem获取数据字段的值;DetailsView控件的ItemCommand也一样无法获得.
对于BoundField 绑定的值,我们只要取 gvRow.Cells(indexValue).Text即可.
对于TemplateField 绑定的值,分别采用LiteralControl间隔分割所有控件:第i个控件内部索引为iX2+1
如何查找模板内的控件:只要gvRow.findControl即可搞定.

II).RowDataBound中,我们需要对要绑定的数据执行特殊的处理,如格式化,添加样式,加入javascript等.
选定行的索引:
        e.row.rowIndex           
将要绑定行的主键值:
        GridView1.DataKeys(e.Row.RowIndex).Value
选定行内的控件:
         e.row.findcontrol     
将要绑定行的某字段的值:
        e.row.dataitem()
sender对象:
        System.Web.UI.WebControls.GridView
二.DetailsView
   Protected Sub DetailsView1_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewCommandEventArgs)
★内部组件的查找:
sender代表DetailsView控件; 命令所在的列非模板列时e.CommandSource都是DetailsView控件本身;模板列则取其NameContainer,这和GridView一样.
利用DetailsView控件的FindControl方法可以找到控件内的所有对象,而在GridView里面必须用GridViewRow才可以.
★控件结构分析:
DetailsView的每一行都是DetailsViewRow对象,包含多个Cells列.例如第4行第2列里面有个文本框,取其值,方法如下:
ctype(dv.Rows (3).Cells (1).Controls (0),TextBox ).Text -----------> "2007-6-28 15:44:00"   --非模板列
ctype(dv.Rows (3).Cells (1).Controls (1),TextBox ).Text -----------> "2007-6-28 15:44:00"   --模板列
对比GridViewRow和DetailsViewRow其内部控件组织是一样的:
非模板列在编辑,插入等有控件的状态cell内部仅有一个控件,而模板列同GridViewRow的CELL一样,采用LiteralControl分割控件;
对于文本状态,不含控件,取Text属性就OK了.
★DataItem:和GridView控件一样,ItemCommand命令执行时,控件的DataItem未被设置,自然无法取值!
要取主键的值,用DetailsView1.DataKeys(0).ToString 搞定;
GridView要指定DataKeys的索引,为:GridViewRow.RowIndex
在多页面显示时,可以用DetailsView.PageIndex取得页号. 分页时执行CommandName:Page
--==---------------------------------------------------------------------------==--
对于DetailsView控件,执行的顺序是: DataBinding -> ItemCreated -> DataBound ; 在再次加载时DataBinding事件就没有了.
 ItemCreated中可以更改绑定数据的内容;DataBound中可以根据内容执行其他的操作.
类似GridView控件的RowDataBound事件,DetailsView为ItemCreated事件.

EG.

    protected void dvQuestion_ItemCreated(object sender, EventArgs e)
    {
        Button oButton = new Button();
        if (dvQuestion.Rows.Count > 1)
        {
            oButton = FindCommandFieldButton((DataControlFieldCell)dvQuestion.Rows[3].Cells[0], "Delete");
            if (oButton != null)
                oButton.Attributes.Add("onclick", "javascript:if(confirm('确实要删除该常见问题吗?')==false) return; ");
        }
    }

你可能感兴趣的:(textbox,javascript,button,object,delete,null,ASP.NET)