GridView 控件常见问题及处理方法

翻译|其它|编辑:郝浩|2007-08-03 09:33:05.000|阅读 2141 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

Asp.net 1.1版本中的 DataGrid 控件用于显示表格式的数据,相信大家都用过。Asp.net 2.0版本中GridView 控件是 DataGrid 控件的继承者,功能比 DataGrid 增强不少,但是也有很多地方不同。下面把使用中发现的不同点列举如下,希望能对大家的工作有所帮助:

 

1. 关于隐藏字段的处理:

DataGrid 中我们一般把不需要显示又需要在编程中使用的字段在设计期设置为 Visible=False,这样的字段不会显示出来,但在绑定数据时会被绑定值,所以我们可以通过 DataGridItem.Cell[x].Text 取到所需数据行的数据。

GridView 中直接在设计期设置 Visible=False 却不能满足上述需求,因为这样设置,虽然字段不会被显示出来了,但数据也没有被绑定到相应的 Cell 中,通过 GridViewRow.Cell[x]. Text 取到的全是空字符串,估计应该是控件的 Bug。如果想达到上述的效果,可以通过其它方法实现,只是麻烦一些:

首先,不要设置字段的 Visible=False ,然后处理RowDataBound事件。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{

e.Row.Cells[x].Visible = false;
}

 

2. 关于按钮列的事件:

DataGrid 中,要响应控钮列中的按钮点击事件,可以处理 ItemCommand 事件:事件的第一个参数 source object 类型的,值为 DataGrid,第二个参数 e DataGridCommandEventArgs 类型的,e 中包含四个属性:Item的值为按钮所在的行,CommandSource 的值为所点击的按钮,CommandName 的值为按钮在设计期定义的值,CommandArgument 的值固定为空字符串。在使用中,可以根据 Item 来区分点击的是哪个行中的按钮,可以根据 CommandName 来区分一个行中的多个按钮。

Private void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)
{
}

GridView 中,要响应控钮列中的按钮点击事件,可以处理 RowCommand 事件:事件的第一个参数 sender object 类型的,值为 GridView,第二个参数 e GridViewCommandEventArgs 类型的,e 中仅包含三个属性,比 DataGrid 控件中的相应事件少了关键的 Item 属性,CommandSource 的值也与 DataGrid 中的不一样,在这里为 GridViewCommandName 的值为按钮在设计期定义的值,CommandArgument 的值为被点击的按钮所在行的索引。在使用中,可以根据 CommandArgument 来区分点击的是哪个行中的按钮,可以根据 CommandName 来区分一个行中的多个按钮。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{

GridViewRow item = this.GridView1.Rows[Convert.ToInt32(e.CommandArgument)];
}

 

3.关于按钮的客户端提示:

一般情况下,我们希望在最终删除一条数据之前让用户进行确认,这个可以使用模板列,在模板列中放置按钮控件,为按钮设置客户端单击事件。

Asp.net 1.1中,需要使用编程方法才能为按钮指定客户端单击事件,方法如下:

<asp:TemplateColumn>

<ItemTemplate>

<asp:LinkButton id="LinkButton1"runat="server"

CausesValidation="false"CommandName="Test" Text="Button"></asp:LinkButton>

</ItemTemplate>

</asp:TemplateColumn>

private void DataGrid1_ItemCreated(object sender, DataGridItemEventArgs e)

{

LinkButton btn = e.Item.FindControl("LinkButton1") as LinkButton;

if(btn != null)

{

btn.Attributes.Add("onclick","return confirm('你确认要删除这条数据吗?');");
}

}

Asp.net 2.0中,方便了许多,可以在设计期设置 OnClientClick 属性来为按钮指定客户端单击事件,方法如下:

<asp:TemplateField ShowHeader="False">

<ItemTemplate>

<asp:LinkButton ID="LinkButton1" runat="server"

CausesValidation="false" CommandName="Test" Text="按钮"OnClientClick="return confirm('你确认要删除这条数据吗?');"></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

 

4.关于时间字段的格式化输出:

假如我们有一个时间字段,数据为"2005-12-23 10:01:20",想显示为"10:01"

DataGrid 中,我们可以简单的设置字段的显示格式即可,如:

<asp:BoundField DataField="datetime" DataFormatString="{0:HH:mm}" />

GridView 中,相同的方法,却显示错误,仍显示为"2005-12-23 10:01:20",估计是控件的Bug(呵呵,Bug 还真不少,微软这样的公司发布的东西也这么多 Bug。可见...),不过,可以使用模板列解决此问题,方法如下:

<asp:TemplateField HeaderText="时间">

<ItemTemplate>

<asp:Label ID="Label1" runat="server" Text='<%# Bind("datetime", "{0:HH:mm}") %>'></asp:Label>

</ItemTemplate>

</asp:TemplateField>

 

5.关于绑定空记录:

DataGrid 中,我们可以把一个包含空记录的 DataSet DataTable 绑定给 DataGrid,这样,呈现时,DataGrid 会把数据源中的字段定义以表头的形式显示出来。

GridView 控件中,却不可以,如果 DataSet DataTable 是空记录。则 GridView 连表头都不显示。只能通过变通的方法实现,稍微有一些麻烦:

public void BuildNoRecords(GridView gridView, DataSet ds)

{

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.";

}

else

{

gridView.DataSource = ds;

gridView.DataBind();

}

}

 

6.关于数据绑定,GridView使用新的数据绑定模式,请参考其它文献。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP