IMZRH的日志

努力成为一个有用的人

导航

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

Posted on 2007-10-18 09:02  张荣华  阅读(1093)  评论(0编辑  收藏  举报

    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中的不一样,在这里为GridView,CommandName的值为按钮 在设计期定义的值,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中启用无刷新分页

    .net 2.0中将GridView的“EnableSortingAndPagingCallbacks”属性设置为True就可以了,但是有一个限制,即一旦启用了Callback能力,GridView就不能使用数据透视表选取模式 (selection),否则,运行时就会产生错误警告的消息。而且GridView的Callback能力并不 是全面性的,上面挑明了只有分页与排序两个操作会可以无刷新,对于编辑、选择、删除或更新等等的操作还是会刷新。

7 GridView中设置日期格式不起作用的解决方法

8 数据源为空时如何让GridView显示表头和提示

9 GridView的第一列是ButtonField,字段名是"删除",想一点之后弹出确认框,否则返回.应该如何写?

10 GridView中模板列的排序问题

11 GridView中出现“TemplateField 上不支持回调,因为某些控件不能在回调中正确更新。”的解决方法

12 "控件必须放在具有 runat=server 的窗体标记内"错误的解决方法 

13 DataView 使用技巧