7.3 FormView控件

无论在功能上还是在使用方法上,FormView控件与DetailsView控件都非常相似,FormView控件使你同样可以使用数据源中的单个记录。它也用于更新和插入新记录,并且通常在主/详细方案中使用,在这些方案中,主控件的选中记录决定要在FormView控件中显示的记录。

它们之间的差别在于:DetailsView控件使用表格布局,在该布局中,记录的每个字段都各自显示为一行;而FormView控件不指定用于显示记录的预定义布局,它在显示上比DetailsView控件具有更大的灵活性。实际上,将创建一个包含控件的模板,以显示记录中的各个字段,该模板中可以包含用于创建窗体的格式、控件和绑定表达式等。

可以通过创建模板来为FormView控件生成用户界面,为不同操作指定不同的模板,如表7-6所示。例如,可以为显示、插入和编辑模式创建一个ItemTemplate模板,也可以使用PagerTemplate模板控制分页,还可以使用HeaderTemplate和FooterTemplate模板分别自定义FormView控件的页眉和页脚,使用EmptyDataTemplate模板还可以指定在数据源不返回任何数据时显示的模板等。

figure_0281_0193

如下面的示例代码所示:


<asp:FormView ID="FormView1"runat="server">

<ItemTemplate>

<b>

<%#Eval("employeeid")%>.

<%#Eval("employeename")%>详细情况:

</b>

<hr/>

<small>

<li>部门:<%#Eval("department")%>

</li>

<li>地址:<%#Eval("address")%>

</li>

<li>邮箱:<%#Eval("email")%>

</li>

</small>

</ItemTemplate>

</asp:FormView>


运行结果如图7-13所示。

figure_0281_0194

图 7-13 FormView控件示例运行结果

与DetailsView控件一样,FormView控件也提供许多内置功能,这些功能使用户可以对控件中的项进行更新、删除、插入和分页。FormView控件绑定到数据源控件时,FormView控件可以利用该数据源控件的功能并提供自动更新、删除、插入和分页功能;同时,FormView控件也可以为用其他类型的数据源进行更新、删除、插入和分页操作提供支持。只需要像DetailsView控件那样提供一个适当的事件处理程序,其中包含对这些操作的实现就可以了。

值得注意的是,因为FormView控件使用模板,所以该控件不提供自动生成命令按钮以执行更新、删除或插入操作的方法。因此,必须手动将这些命令按钮包含在适当的模板中,FormView控件识别某些CommandName属性设置为特定值的按钮。表7-7列出了FormView控件识别的命令按钮。

figure_0282_0195

命令按钮的使用示例如下面的代码所示:


<asp:FormView ID="FormView1"AllowPaging="true"runat="server"

OnPageIndexChanging="FormView1_PageIndexChanging">

<ItemTemplate>

<b>

<%#Eval("employeeid")%>.

<%#Eval("employeename")%>详细情况:

</b>

<hr/>

<small>

<li>

部门:<%#Eval("department")%>

</li>

<li>

地址:<%#Eval("address")%>

</li>

<li>

邮箱:<%#Eval("email")%>

</li>

</small>

</ItemTemplate>

<PagerTemplate>

<table>

<tr>

<td>

<asp:LinkButton ID="FirstButton"

CommandName="Page"CommandArgument="First"

Text="首页"runat="server"/>

</td>

<td>

<asp:LinkButton ID="PrevButton"

CommandName="Page"CommandArgument="Prev"

Text="上一页"runat="server"/>

</td>

<td>

<asp:LinkButton ID="NextButton"

CommandName="Page"CommandArgument="Next"

Text="下一页"runat="server"/>

</td>

<td>

<asp:LinkButton ID="LastButton"

CommandName="Page"CommandArgument="Last"

Text="末页"runat="server"/>

</td>

</tr>

</table>

</PagerTemplate>

</asp:FormView>


在PagerTemplate模板里创建好Page命令按钮之后,当在页面单击这些按钮时,它将触发FormView控件的FormView1_PageIndexChanging事件。其中,FormView1_PageIndexChanging事件处理代码如下所示:


public partial class FormViewTest:System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if(!IsPostBack)

{

Bind();

}

}

private void Bind()

{

FormView1.DataSource=

DbHelper.Instance.CreateDataTable(CommandType.Text,

"select*from employee");

FormView1.DataBind();

}

protected void FormView1_PageIndexChanging(object sender,

FormViewPageEventArgs e)

{

this.FormView1.PageIndex=e.NewPageIndex;

Bind();

}

}


示例运行结果如图7-14所示。

最后需要说明的是,默认情况下,FormView控件使用HTML表显示其内容,但这会使对该控件的内容应用CSS样式变得困难。通过将RenderTable属性设置为false,可以将FormView控件配置为不呈现HTML表标记。这样,也就更容易对控件内容应用CSS样式了。设置示例如下面的代码所示:

figure_0284_0196

图 7-14 FormView控件分页示例运行结果


<asp:FormView ID="FormView1"runat="server"

RenderTable="false">