Spiga

GridView控件使用经验

2005-12-22 23:06 by geff zhang, 36965 visits, 网摘, 收藏, 编辑

   GridView控件是Asp.net 1.1版本流行控件DataGrid的继承者,功能比DataGrid增强不少,但是也有很大的不同啊。将最近使用这个控件的经验同各位同学分享如下:
   1\掩藏字段的处理:DataGrid可以将字段直接设置为Visible=false,可以通过Cell[x].Text取到值。 GridView这个功能失效了,可以使用运行时来设定该列为掩藏。处理RowDataBound事件。
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
   e.Row.Cells[5].Visible = false;
}
   2\ 获取所选列的数据:DataGrid可以直接通过所选行来获取,GridView同样的代码无法运行。GridView 可以通过GridViewRow来获取。BtnAudit是模版列中的按钮。
GridViewRow grdRow = (GridViewRow)btnAudit.Parent.Parent;

 string strId = grdRow.Cells[0].Text;
 string memberId = grdRow.Cells[5].Text;
  3\ 最终删除一条数据之前进行确认,这个可以使用摸版列,在摸版列中放置按钮控件,其中有一个客户端事件onclientclick,这里可以写确认处理javascript脚本.例如:
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Button ID="btnRefuse" runat="server" OnClick="btnRefuse_Click" Text="拒绝"  OnClientClick="return confirm(' 你真的要拒绝这个用户加入俱乐部?')"/>
                </ItemTemplate>
            </asp:TemplateField>


ObjectDataSource In Depth

Combining a BuildProvider and IExtenderProvider to create a declarative framework for conditional formatting in ASP.NET GridViews.
http://www.codeproject.com/aspnet/GridThemes.asp
作者: 自由、创新、研究、探索……
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://www.openbeta.cn/
0
0
(请您对文章做出评价)
« 上一篇:使用xfce4桌面系统
» 下一篇:JOnAS
Add your comment

44 条回复

  1. #1楼 kasafuma      2005-12-22 23:42
    Cells[x].Text取到值
      回复  引用  查看    
  2. #2楼 NeedForSleep      2005-12-23 10:08
    这几天在用这个控件做一些演示。发觉得这个控件似乎只是个半成品。或者说我对GridView还不习惯。。。。。。

    1、无法绑定控记录。当GridView去绑定DataSet时,如果DataSet是空记录。则GridView连表头都不显示,感到很郁闷。。。。。。

    2、绑定列对于时间的格式好像支持的有错误。
    比如我有个时间字段datetime="2005-12-23 10:01:00"
    当我的GridView使用绑定列,就无法设置格式。
    <asp:BoundField DataField="datetime" DataFormatString="{0:HH:mm}" />
    这样,在列中,它还是显示:2005-12-23 10:01:00

    如果我使用模板列,却是成功的。
    <asp:TemplateField>
    <ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# Bind("datetime", "{0:HH:mm}") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    这样,在列中,它显示:10:01

    可用DataGrid却不会出此问题。。。。。。
      回复  引用  查看    
  3. #3楼 james.yu[未注册用户]2005-12-23 12:59
    如果要应用 formatstring ,必须将该列 Behavior-> HtmlEncode 设置为False,这个问题也困惑了我很久 :)
      回复  引用    
  4. #4楼 周奔驰      2005-12-23 17:10
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
    GridViewRow row = GridView1.SelectedRow;
    int id =Convert.ToInt32(GridView1.SelectedDataKey.Value);
    }
      回复  引用  查看    
  5. #5楼 wu ming[未注册用户]2005-12-27 12:36
    alex readed!
      回复  引用    
  6. #6楼 hr[未注册用户]2006-01-05 13:47
    前面的同志说的时间格式的问题,我好像解决了。
    加入以下代码就好。DataFormatString="{0:yyyy-MM-dd}
      回复  引用    
  7. #7楼 防伪底纹设计 防伪标签 封口标签[未注册用户]2006-01-29 16:21
    多谢了。困惑了 一个下午/
      回复  引用    
  8. #8楼 Tony_Zhu[未注册用户]2006-03-09 09:08
    把GridView绑定到DataSet,点击了Edit后出现更新和取消,却发现修改完数据后,更新按钮不响应,不知为什么?郁闷.。。。,请赐教!

    Email:swaterpig@gmail.com;Thanks!
      回复  引用    
  9. #9楼 尖锐湿疣[未注册用户]2006-03-09 16:14
    Behavior-> HtmlEncode
    我自己手动设置datasource
    然后怎么设置HTMLENCODE?
      回复  引用    
  10. #10楼[楼主] 自由、创新、研究、探索……      2006-03-09 21:39
    @尖锐湿疣
    可以在事件GridView1_RowCreated中进行处理

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
    DataControlField c = GridView1.Columns[2];
    if (c is BoundField)
    {
    BoundField bf = (BoundField)c;
    bf.HtmlEncode = true;
    }
    }
      回复  引用  查看    
  11. #11楼[楼主] 自由、创新、研究、探索……      2006-03-10 22:18
    http://www.thecodeproject.com/aspnet/GridViewRedux.asp
    http://www.thecodeproject.com/aspnet/addupdate.asp
    http://www.thecodeproject.com/aspnet/GridViewClientPostBack.asp
    http://www.thecodeproject.com/aspnet/GridViewConfirmDelete.asp
      回复  引用  查看    
  12. #12楼[楼主] 自由、创新、研究、探索……      2006-03-10 22:20
    http://www.thecodeproject.com/aspnet/GridViewRadiobuttons.asp
    http://www.thecodeproject.com/aspnet/MasterDetail.asp
    http://www.thecodeproject.com/aspnet/CustomBusinessObjects.asp
      回复  引用  查看    
  13. #13楼[楼主] 自由、创新、研究、探索……      2006-03-21 20:22
    Show Header/Footer of Gridview with Empty Data Source
    public void BuildNoRecords(GridView gridView, DataSet ds)
    {
    try {
    if (ds.Tables(0).Rows.Count == 0) {
    ds.Tables(0).Rows.Add(ds.Tables(0).NewRow());
    gridView.DataSource = ds;
    gridView.DataBind();
    int columnCount = gridView.Rows(0).Cells.Count;
    gridView.Rows(0).Cells.Clear();
    gridView.Rows(0).Cells.Add(new TableCell());
    gridView.Rows(0).Cells(0).ColumnSpan = columnCount;
    gridView.Rows(0).Cells(0).Text = "No Records Found.";
    }
    } catch (Exception ex) {
    }
    }
      回复  引用  查看    
  14. #14楼[楼主] 自由、创新、研究、探索……      2006-03-21 20:23
    http://weblogs.asp.net/despos/archive/2005/06/30/416783.aspx
      回复  引用  查看    
  15. #15楼 感到郁闷[未注册用户]2006-04-08 14:24
    各位好。
    我也在使用GRIDVIEW。
    查了MSND也找了不少文章。
    始终没办法找到其类似DATAGRID中
    VirtualItemCount[获取或设置在使用自定义分页时 DataGrid 控件中的实际项数。]

    各位的分页功能是怎么写的呢?
    难道都读出整个表的数据么?
      回复  引用    
  16. #16楼 梁广永      2006-04-14 16:06
    学习,
      回复  引用  查看    
  17. #17楼 kiler      2006-07-06 01:17
    @感到郁闷
    分页读取数据,用第3方的分页控件显示分页条,DATAGRID只显示当页数据.
      回复  引用  查看    
  18. #18楼 ssj[未注册用户]2006-07-26 16:22
    DataFormatString的问题也是困扰了我很久,最终只好写了一个方法来格式化数据:public static void FormatNumericData (GridView grid, params string[] fieldNames)
    对于负数,显示为红色

    感觉GridView针对使用DataSourceID做了很多附加处理,对于使用DataSource,简直就是鸡肋
      回复  引用    
  19. #19楼 RedVesper[未注册用户]2006-08-05 16:57
    2\ 获取所选列的数据:DataGrid可以直接通过所选行来获取,GridView同样的代码无法运行。GridView 可以通过GridViewRow来获取。BtnAudit是模版列中的按钮。
    GridViewRow grdRow = (GridViewRow)btnAudit.Parent.Parent;

    string strId = grdRow.Cells[0].Text;
    string memberId = grdRow.Cells[5].Text;

    这段代码放到GridView的什么事件中?
    我放到RowCommand()事件中根本就取不到,而且报的错误信息.
    指点
      回复  引用    
  20. #20楼[楼主] 自由、创新、研究、探索……      2006-08-06 00:01
    http://209.171.52.99/useritems/TariqMultiHeaderGridview.asp

    http://209.171.52.99/useritems/PagingWithODS.asp
      回复  引用  查看    
  21. #21楼[楼主] 自由、创新、研究、探索……      2006-08-06 11:28
    @RedVesper
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" AllowPaging="True" AllowSorting="True" OnRowDataBound="GridView1_RowDataBound">
    <Columns>
    <asp:BoundField DataField="Id" HeaderText="Id" />
    <asp:BoundField DataField="name" HeaderText="俱乐部名称" />
    <asp:BoundField DataField="username" HeaderText="用户姓名" />
    <asp:BoundField DataField="city" HeaderText="所在城市" />
    <asp:BoundField DataField="Company" HeaderText="服务的公司" />
    <asp:BoundField DataField="memberid" HeaderText="用户ID" />
    <asp:TemplateField ShowHeader="False">
    <ItemTemplate>
    <asp:Button ID="btnAudit" runat="server" CausesValidation="false" OnClick= "btnAudit_Click" Text="同意" />
    </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField>
    <ItemTemplate>
    <asp:Button ID="btnRefuse" runat="server" OnClick="btnRefuse_Click" Text="拒绝" OnClientClick="return confirm(' 你真的要拒绝这个用户加入俱乐部?')"/>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    <PagerSettings Mode="NumericFirstLast" Position="TopAndBottom" />
    </asp:GridView>

    /// <summary>
    /// 拒绝成员注册审核
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnRefuse_Click(object sender, EventArgs e)
    {
    try
    {
    Button btnRefuse = (Button)sender;
    GridViewRow grdRow = (GridViewRow)btnRefuse.Parent.Parent;
    string strId = grdRow.Cells[0].Text;
    string memberId = grdRow.Cells[7].Text;
    ClubMemberManager.AuditClubMemberInfo(Convert.ToInt32(strId),memberId, -1);
    }
    catch (BusinessLayerException ex)
    {
    this.ProcessLogException(ex);
    }


    }
      回复  引用  查看    
  22. #22楼[楼主] 自由、创新、研究、探索……      2006-08-30 14:21
    ASP.NET 2.0: Playing a bit with GridView "Sort Grouping"
    http://aspadvice.com/blogs/joteke/archive/2006/02/11/15130.aspx
      回复  引用  查看    
  23. #23楼 zhang[匿名][未注册用户]2006-09-03 15:35
    如果没有设置模版列,我们将如何取得值
    GridViewRow grdRow = (GridViewRow)btnRefuse.Parent.Parent;
    string strId = grdRow.Cells[0].Text;
    string memberId = grdRow.Cells[7].Text;
    好像不能用,那该什么办。
    指点
      回复  引用    
  24. #24楼[楼主] 自由、创新、研究、探索……      2006-09-11 10:19
    @zhang[匿名]
    可以在RowCreated事件中赋予控件CommandArgument属性中保存当前行的ID,例如下面的处理方式
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
    int index = Convert.ToInt32(e.CommandArgument);
    GridViewRow row = this.grvCompany.Rows[index];
    string companyID = ((Label)row.Cells[0].FindControl("lblID")).Text;
    ……

    }

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    LinkButton lnbCompanyDetail = (LinkButton)e.Row.FindControl("lnbCompanyDetail");
    LinkButton lnbLocations = (LinkButton)e.Row.FindControl("lnbLocations");
    LinkButton lnbUsers = (LinkButton)e.Row.FindControl("lnbUsers");

    lnbCompanyDetail.CommandArgument = e.Row.RowIndex.ToString();
    lnbLocations.CommandArgument = e.Row.RowIndex.ToString();
    lnbUsers.CommandArgument = e.Row.RowIndex.ToString();
    }
    }
      回复  引用  查看    
  25. #25楼 zhang[匿名][未注册用户]2006-09-11 18:51
    自由、创新、研究、探索……
    谢谢啦!!!
      回复  引用    
  26. #26楼 kakake[未注册用户]2006-09-16 10:51
    要在控件的编辑方法中再次绑定数据就好了
      回复  引用    
  27. #27楼 花芽QQ 78793450[未注册用户]2006-10-09 11:49
    提个问题:

    绑定了数据源的GridView1 想在某个字段内获取同个页面的一个session值。。
    通过什么方法可以获得啊、还有想在模板行添加个 textbox 无法显示

    <iframe src=user_index.aspx width="100%" height="100%" scrolling="no" frameborder="0"></iframe>

    这种值。。
      回复  引用    
  28. #28楼[楼主] 自由、创新、研究、探索……      2006-10-18 09:44
    Formatting AutoGenerateColumns in an ASP.NET Grid
    http://www.codeproject.com/aspnet/FrmtAutoGenClmnASPNETGrid.asp
      回复  引用  查看    
  29. #29楼 young[匿名][未注册用户]2006-11-04 00:27
    数据源如果直接设置在Gridview里,那就破坏了三层开发的结构,但是如果不绑定在里面,又没有办法设置列,这该怎么解决啊?
      回复  引用    
  30. #30楼[楼主] 自由、创新、研究、探索……      2006-11-04 09:04
    @young[匿名]
    objectdatasource控件,在.NET 2.0中,有了该控件,可以很方便地沟通表示层和逻辑层,而不会坏了三层开发的结构
    李万宝的blog上有好几个ObjectDataSource控件的介绍http://www.cnblogs.com/mqingqing123/category/32262.html?Show=All
      回复  引用  查看    
  31. #31楼 火星星      2007-01-09 08:31
    在第一条中如果直接写e.Row.Cells[5].Visible = false;
    会出错
    必须在下面两条语句中都写
    if (e.Row.RowType == DataControlRowType.Header)
    {
    e.Row.Cells[3].Visible = false;
    }
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    e.Row.Cells[3].Visible = false;
    }
      回复  引用  查看    
  32. #32楼 violet[匿名][未注册用户]2007-01-11 10:25
    请教GridView中GridLines的颜色怎么设置呀??
      回复  引用    
  33. #33楼 QQ:124294272[未注册用户]2007-06-26 10:30
    用 gridviewrow dr=(gridviewrow)sender.namecaintixxx
    即可
      回复  引用    
  34. #34楼 Lodestar[未注册用户]2007-08-27 15:02
    @hr
    Eval("DateTime","{0:yyyy-M-dd}")
    大小写也要注意的,WebCast里有说,我是初学者呵呵.
      回复  引用    
  35. #35楼 daijun[未注册用户]2007-09-24 10:45
    吃不到葡萄说葡萄酸的人,我见多了.

    不会用gridview,就不要说它不好用!
      回复  引用    
  36. #36楼 fangzi[未注册用户]2008-07-14 15:45
    我在 RowDataBound 事件里面写了 e.Row.Cells[0].Visible = false;
    来隐藏,但是在脚本里却获得不到第一列的值。并且选中另外一行的话,修改层里的数据不会随之变化。(层与Gridview是同在一个页面)
      回复  引用    
  37. #37楼[楼主] 自由、创新、研究、探索……      2008-07-15 09:23
    @fangzi
    e.Row.Cells[0].Visible 这是服务端,这样就没有把这一列输出到客户端了,所以在客户端的Js中是取不到的。
      回复  引用  查看    
  38. #38楼 蓝天旭日      2008-08-12 16:26
    凑个热闹!
      回复  引用  查看    
  39. #39楼 ajiecs[未注册用户]2008-09-11 10:14
    谢谢学习中~
      回复  引用    
  40. #40楼 龙儿      2008-12-04 00:19
    --引用--------------------------------------------------
    fangzi: 我在 RowDataBound 事件里面写了 e.Row.Cells[0].Visible = false;
    <br>来隐藏,但是在脚本里却获得不到第一列的值。并且选中另外一行的话,修改层里的数据不会随之变化。(层与Gridview是同在一个页面)
    <br>
    --------------------------------------------------------
    可以把你需要发生到客户端的字段设置在DataKeyNames就可以取值
      回复  引用  查看    
  41. #41楼 lrj[未注册用户]2009-05-25 09:05
    @NeedForSleep
    那是因为你没有设置一个属性htmlencode
      回复  引用    
  42. #42楼 renhua127      2009-08-13 13:23
    呵呵,学习了
      回复  引用  查看