李晓亮的博客

导航

GridView常用小知识点汇总(1)

1.不使用数据源控件,通过给DataSource动态添加数据源的方式绑定数据时如何取得控件的关键字的值:
GridView1_RowDeleting和GridView1_RowUpdating事件中通过GridView1.DataKeys[e.RowIndex].Value或GridView1.DataKeys[e.RowIndex]["字段名"]取值。不能通过e.Keys["字段名"]取到值。

注意:要设置GridView的DataKeyNames主键属性。
2.为GridView中的HyperLink列添加弹出模式窗体功能

View Code
<asp:TemplateField HeaderText="材料分类">
                            
<ItemTemplate>
                                
<asp:HyperLink ID="HlkCateSlt" runat="server" NavigateUrl='<%# "javascript:window.showModalDialog(\"../ItemMng/CateDetail.aspx?CateId="+ Eval("fd_category_id") +"&CateName="+ Eval("fd_category_name")+"&CateType="+ Eval("fd_category_type")+"&OptType=0&CateCode="+Eval("fd_category_code")+"\",\"选项修改\",\"help:no;resizable:no;scroll:no;status:0;dialogWidth:620px;dialogHeight:620px;center:yes;\");" %>'>材料分类</asp:HyperLink>
                            
</ItemTemplate>
                        
</asp:TemplateField>

3.GridView中的HyperLink列,传递多参数到连接的页面

View Code
<asp:TemplateField HeaderText="项目名称">
                            
<ItemTemplate>
                                
<asp:HyperLink ID="HlkItemName" runat="server" NavigateUrl='<%# "~/ItemMng/ItemDetail.aspx?ItemId="+ Eval("fd_item_id")+ "&ItemName="+ Eval("fd_item_name")+"&PartCode="+ Eval("fd_part_code")+"&LimitSeq="+ Eval("fd_limit_seq").ToString()+"&OptFlag=0&AreaCode="+Eval("fd_area_code").ToString() %>' Text='<%# Eval("fd_item_name") %>'></asp:HyperLink>
                            
</ItemTemplate>
                        
</asp:TemplateField>

4.在GridView的RowDataBound事件中,通过单元格的子控件找到,反找单元格对象:

View Code
<asp:TemplateField HeaderText="处理确认" ShowHeader="False">
                            
<ItemTemplate>
                                
<asp:Button ID="BtnChlqr" runat="server" CausesValidation="false" CommandName="CHLQR" Text="确认" />
                            
</ItemTemplate>
                        
</asp:TemplateField>
View Code
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        
if (e.Row.RowType == DataControlRowType.DataRow)
        {
           Button BtnChlqr 
= e.Row.FindControl("BtnChlqr"as Button;
            
if (BtnChlqr!= null) BtnHxqr.CommandArgument = e.Row.RowIndex.ToString();
            DataControlFieldCell fc 
= BtnChlqr.Parent as DataControlFieldCell;
            
if (fc.Text != "" && fc.Text != "&nbsp;")
            {
                 
//处理语句
            }
        }
     }

5.GridView的RowDataBound事件中,同时获取“正常行的编辑态”和“交替行的编辑态”:

View Code
if(e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
{
   
//进行处理
}

6.序号列

方式1:

 

Container.DataItemIndex
<asp:TemplateField HeaderText="序号"> 
<ItemTemplate> 
   <%# Container.DataItemIndex + 1%> 
 </ItemTemplate> 
</asp:TemplateField>

 

方式2:

 

考虑分页的情况
<asp:TemplateField HeaderText="序号"> 
<ItemTemplate> 
<%# this.GridView1.PageIndex  * GridView1.PageSize 
+ GridView1.Rows.Count + 1%> 
</ItemTemplate> 
</asp:TemplateField>

 

 

 

7.GridView中使用DropDownList

 

RowCreated
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        //可动态创建控件
        switch (e.Row.RowType)
        {
            case DataControlRowType.DataRow://只有数据行可以绑定数据
                #region 编辑态时控件的处理
                //正常行的编辑态、交替行的编辑态
                if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
                {
                    //物理化学区分
                    DropDownList ddlPhysChem = e.Row.FindControl("ddlPhysChem"as DropDownList;
                    ddlPhysChem.Items.Clear();
                    ddlPhysChem.Items.Add(new ListItem("物理""物理"));
                    ddlPhysChem.Items.Add(new ListItem("化学""化学"));

                    //状态标记
                    DropDownList ddlEnabledFlag = e.Row.FindControl("ddlEnabledFlag"as DropDownList;
                    ddlEnabledFlag.Items.Clear();
                    ddlEnabledFlag.Items.Add(new ListItem("禁用""0"));
                    ddlEnabledFlag.Items.Add(new ListItem("启用""1"));
                }

                #endregion
                break;
            default:
                break;
        }
    }

 

 

RowDataBound
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        try
        {
            switch (e.Row.RowType)
            {
                case DataControlRowType.DataRow:
                    //Convert.ToString(DataBinder.Eval(e.Row.DataItem, "rec_id"));
                    string strAskDelMsg = "javascript:return confirm('您确定要删除该记录吗?')";
                    Button BtnTemp = e.Row.FindControl("btnDelRow"as Button;
                    BtnTemp.OnClientClick = strAskDelMsg;
                    //LinkBtnTemp.Attributes.Add("onclick", strAskDelMsg);
                    string strPhysChem = "", strEnabledFlag="";
                    #region 编辑态时控件的处理
                    //正常行的编辑态、交替行的编辑态
                    if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
                    {
                        //物理化学区分
                        strPhysChem = DataBinder.Eval(e.Row.DataItem, "fd_phys_chem").ToString();
                        DropDownList ddlPhysChem = e.Row.FindControl("ddlPhysChem"as DropDownList;
                        
                        if (ddlPhysChem != null )
                        {
                            ListItem ItemSlt = ddlFdPhysChem.Items.FindByValue(strPhysChem);

                            if (ItemSlt != null) ItemSlt.Selected = true;
                        }

                        //状态标记
                        strEnabledFlag = DataBinder.Eval(e.Row.DataItem, "fd_enabled_flag").ToString();
                        DropDownList ddlEnabledFlag = e.Row.FindControl("ddlEnabledFlag"as DropDownList;

                        if (ddlPhysChem != null)
                        {
                            ListItem ItemSlt = ddlFdPhysChem.Items.FindByValue(strEnabledFlag);

                            if (ItemSlt != null) ItemSlt.Selected = true;
                        }
                    }
                    #endregion
                    #region 浏览态时控件的处理
                    //正常行的浏览态、交替行的浏览态
                    if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Normal))
                    {
                        strEnabledFlag = DataBinder.Eval(e.Row.DataItem, "fd_enabled_flag").ToString();
                        Label lblEnabledFlag = e.Row.FindControl("lblEnabledFlag"as Label;
                        lblEnabledFlag.Text = strEnabledFlag.Equals("1") ? "启用" : "禁用";
                    }
                    #endregion
                    break;
                default:
                    break;
            }
        }
        catch (Exception ex)
        {
            lblMsg.Text = "RowDataBound():" + ex.Message;
        }
    }

 

8.GridView的RowDataBound事件中,获取当前行的某个数据列

http://msdn.microsoft.com/en-us/library/ms972833.aspx
<1>. Cells[x].Txt。
     从列单元格的文本值获取。这种方法简单高率,最为常用,但是功能单纯。此法存在几个缺点:
     (1)无法获取到设置了隐藏属性的数据列的值,所取到的值为“”(空)。
     (2)只能获取在HTML中定义过的数据列,无法查询数据源中的当前数据行的所有字段列。一般情况下,通过HTML设置GridView的字段列的数量往往小于数据源的实际字段数量,这是因为从业务逻辑的角度看,并不是所有的字段都是要显示在页面上的。当需要使用没有被显示的字段时,此法就不能直接满足需求了。

<2>. e.Row.Cells[x].FindControl("YourcontrolName")。
     这是在单元格内查找某个服务器控件,从而获得其数据值。这种方式可以操作单元格内的服务器控件。此法一般用于处理模板列中的数据或控件。

<3>. (DataRowView)e.Row.DataItem).Row.ItemArray[x].ToString()。
     此法的核心是e.Row.DataItem,它是GridView的行数据集,为Object类型,将其转化为DataRowView类型后,可以获得更多的操作方法。此数据集表示数据源当前行的全部字段列,ItemArray[x]是当前行全部字段列的数组对象,可以通过索引x获得任意字段值。此法的强悍之处是可以对数据源的全部字段查询。

<4>. DataBinder.Eval(e.Row.DataItem, "YourDataFieldName").ToString()。
     此法仍然
基于e.Row.DataItem,其特点是更快捷的获得数据源的任意字段值,因为使用了DataBinder.Eval(),需要注意的是不要写错字段名称。

<5>. 将e.Row.DataItem转化为自定义类型,实现数据类型化。
     例如:
    DSRequestTracking.TB_RequestTrackingRow rtrow=(DSRequestTracking.TB_RequestTrackingRow)((DataRowView)e.Row.DataItem).Row;
     RequestStatusDropDownList1.SelectedValue = rtrow.StatusID.ToString();
     其中DSRequestTracking是通过DSRequestTracking.xsd文件在工程中自定义的强类型DataSet, TB_RequestTrackingRow是VS自动为此强类型生成的创建数据行对象的方法。通过此法,实现了类型化数据的广泛应用。数据类型化的好处很多,显而易见的便是传一个类型数据给方法,取代一大堆参数,另外就是再也不会发生字段名拼写错误的情况。


◆01.知识点-GridView的行类型(DataControlRowType)与行状态(DataControlRowState)

http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.datacontrolrowstate%28v=VS.80%29.aspx

 

 ◆01.1行类型

public enum DataControlRowType

 

成员名称 说明
DataRow 数据控件的数据行。只有 DataRow 行能绑定数据。 
EmptyDataRow 显示页按钮或页导航控件的行。页导航行不能绑定数据。 
Footer 数据控件的脚注行。脚注行不能绑定数据。 
Header 数据控件的标题行。标题行不能绑定数据。 
Pager 显示页按钮或页导航控件的行。页导航行不能绑定数据。 
Separator 行分隔符。行分隔符不能绑定数据。 

 

DataControlRowType 枚举标识数据控件中行的功能。它由 DetailsViewGridView 控件使用,以区分显示数据的行和显示其他用户界面 (UI) 元素的行,如控件的标题行、行分隔符或页导航按钮。

 

当枚举整个 GridViewRowCollectionDetailsViewRowCollection 集合时,可以使用 DataControlRowType 枚举分别标识 GridViewRowDetailsViewRow 对象的类型。如果您在编写使用行的数据控件,可使用 DataControlRowType 枚举标识控件中不同行的功能。 

 

◆01.2行状态

指定数据控件(例如 DetailsViewGridView)中行的状态。

此枚举有一个 FlagsAttribute 属性,允许其成员值按位组合。

 

  [FlagsAttribute]
  public
enum DataControlRowState

成员名称 说明
Normal 指示该数据控件行处于正常状态。 Normal 状态与其他状态相互排斥,但 Alternate 状态除外。
Alternate 指示该数据控件行是交替行。

Alternate 状态在任何时候都可以与其他状态组合,例如与 NormalEditInsert 组合。 这些行可能会受到数据控件的 AlternateRowStyle 属性影响(若已设置)。

Selected 指示该行已被用户选定。
Edit 指示该行处于编辑状态,这通常是单击行的“编辑”按钮的结果。 通常,EditInsert 状态互相排斥。
Insert 指示该行是新行,这通常是单击“插入”按钮添加新行的结果。 通常,InsertEdit 状态互相排斥。

 

 备注


DataControlRowState 枚举标识数据控件(例如 DetailsViewGridView)中行的状态。行的状态可以是一个 DataControlRowState 值或值的组合,因此使用按位运算来确定该行的状态是否包括一个 DataControlRowState 值而非一个等效测试。DataControlRowState 枚举用于任何行类型,而不只用于 DataRow 行(通常,标头和脚注行的状态设置为 Normal)。

 

posted on 2011-07-25 19:15  LeeXiaoLiang  阅读(194)  评论(0)    收藏  举报