我在上两篇中,都介绍了repeater控件,但是repeater控件给我带来最大的麻烦就是在本页面的表中进行编辑更改,换句话说就是直接实现动态更新表比较困难(update),不是说实现不了,只是过程很繁琐,我在用repeater实现动态更改表的时候用到了jQuery,这个语言大家都比较陌生(包括我),所以使用起来不好驾驭而比较困难,而且还要和临时页面一起配合使用,所以真的很麻烦。
其实如果表的结构比较简单(意思是列数并不多,在5列以内)的话,实现动态更新表麻烦程度还可以接受,
然而如果表的结构复杂繁多(列数不仅多,表和其他表还有关联),那么工作量不尽繁多,开发效率低下,而且更重要的是更新时很容易出错,维护起来是十分困难的!
还不如取出要更新行的信息将其更新的功能放入新的页面中单独处理比较好。
那么这个时候,我觉得gridview的优势就十分明显了,它对于表的所有功能操作都十分简单,只要理解到位,是很容易实现的。那么下面我就最近对于gridview的理解和心得向大家分享。
先介绍一下gridview的一些基本知识(我会的)。先看如下代码(这是我做的项目):
前台代码:
<asp:GridView ID="GridView1"
runat="server"
OnRowDataBound="GridView1_RowDataBound"
OnRowEditing="GridView1_RowEditing"
OnRowUpdating="GridView1_RowUpdating"
OnRowCancelingEdit="GridView1_RowCancelingEdit"
OnRowDeleting="GridView1_RowDeleting"
DataKeyNames="classId">
<Columns>
<asp:BoundField HeaderText ="班号" DataField ="classId" />
<asp:BoundField HeaderText ="班级名称" DataField ="className"/>
<asp:BoundField HeaderText ="年级" DataField ="grade"/>
<asp:BoundField HeaderText = "班级人数" DataField ="classNo"/>
<asp:TemplateField HeaderText ="学制">
<ItemTemplate>
<%# eval_r("length")%>
</ItemTemplate>
<EditItemTemplate>
<asp:HiddenField ID="HDFlength" runat="server" Value='<%# eval_r("length") %>' />
<asp:DropDownList ID="DDLlength" runat="server"/>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="辅导员号">
<ItemTemplate>
<%# eval_r("assistantName") %>
</ItemTemplate>
<EditItemTemplate>
<asp:HiddenField ID="HDFassistantName" runat ="server" Value ='<%# eval_r("assistantName") %>'/>
<asp:DropDownList ID="DDLassistantName" runat="server"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText ="备注" DataField ="explain"/>
<asp:CommandField HeaderText ="编辑" ShowEditButton ="true"/>
<asp:CommandField HeaderText ="删除" ShowDeleteButton ="true"/>
</Columns>
</asp:GridView>
我先对我以上加粗变色的标签做下介绍:
OnRowDataBound
gridview控件某一行当绑定数据时促发该事件。
OnRowEditing
gridview控件某一行单击“编辑”按钮时促发该事件。
OnRowUpdating
gridview控件某一行单击“更新”按钮时促发该事件。
OnRowCancelingEdit
gridview控件某一行单击“取消”按钮(退出编辑状态)时促发该事件。
OnRowDeleting
gridview控件某一行单击“删除”按钮时促发该事件。
DataKeyNames
gridview控件被绑定数据库时用于保存主键的字段名称。(这里还有一个妙用:它不仅可以用于储存主键,其实其他字段同样可以保存【甚至所有字段】,比如从数据库读出的所有此段,有时我们并不需要都在gridview中显示出来【比如密码】,这时我们就可以利用此属性来储存该字段信息,以方便我们在后台使用读取)
<Columns>
这个是数据绑定标签的必备标签【容器】,所以没什么可说的,加完gridview标签立马加这个标签。
<asp:BoundField HeaderText ="班号" DataField ="classId" />
普通绑定标签,当处于编辑状态时变为默认的文本框textbox。HeaderText是列名,DataField是绑定的数据库字段名称(下同)。
<asp:TemplateField HeaderText ="学制">
高级绑定标签。用于在gridview中嵌套其他控件。
<ItemTemplate>
作用与普通绑定标签大致相同,只是用来显示绑定后的数据信息。必须与TemplateField配合使用。
<EditItemTemplate>
当某行处于编辑状态时该单元格要显示的控件。
<asp:HiddenField ID="HDFlength" runat="server" Value='<%# eval_r("length") %>' />
这里我嵌套的控件是DropDownList,用的比较多,而HiddenField标签的主要作用是储存绑定数据的信息,当处于编辑状态时,将原始数据赋给DropDownList。比如有“老人”“成人”“小孩”依次加入DropDownList控件选项中。可原始数据是“成人”时,若没有HiddenField储存,那么处于编辑状态而变为DropDownList控件后默认选择的就会使“老人”,会给更新数据带来不便。
<asp:CommandField HeaderText ="编辑" ShowEditButton ="true"/>
这是命令标签。可以显示编辑按钮、删除按钮、选中按钮等(这里我写是编辑按钮,当单击编辑按钮时,页面会自动显示出更新、取消按钮)。
后台代码:
ClassesMgr classesMgr = new ClassesMgr();
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.GridView1_Bind();
}
}
private void GridView1_Bind()
{
//绑定数据库
string specialtyId = ddlSpecialty.SelectedValue.ToString();
DataTable dt = classesMgr.GetAllClasses(specialtyId);
GridView1.DataSource = dt;
//
如果前台gridview标签没加DataKeyNames属性,也可以在后台自己写
//
GridView1.DataKeyNames = new string[] { "classId" };
GridView1.DataBind();
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (((DropDownList)e.Row.FindControl("DDLlength")) != null)
{
DropDownList ddllength = (DropDownList)e.Row.FindControl("DDLlength");
ddllength.Items.Clear();
ddllength.Items.Add(new ListItem("2", "2"));
ddllength.Items.Add(new ListItem("3", "3"));
ddllength.Items.Add(new ListItem("4", "4"));
ddllength.Items.Add(new ListItem("5", "5"));
ddllength.Items.Add(new ListItem("6", "6"));
ddllength.SelectedValue = ((HiddenField)e.Row.FindControl("HDFlength")).Value;
}
if (((DropDownList)e.Row.FindControl("DDLassistantName")) != null)
{
DropDownList dllassistantName = (DropDownList)e.Row.FindControl("DDLassistantName");
DataTable dt = new AssistantMgr().GetAllAssistant(ddlDept.SelectedValue.ToString());
dllassistantName.DataSource = dt.DefaultView;
dllassistantName.DataTextField = "assistantName";
dllassistantName.DataValueField = "assistantId";
dllassistantName.DataBind();
dllassistantName.SelectedValue = ((HiddenField)e.Row.FindControl("HDFassistantName")).Value;
}
foreach (TableCell tc in e.Row.Cells)
{
tc.Attributes["style"] = "border-color:#87D7F7";
}
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
Classes classes = new Classes();
classes.specialtyId = ddlSpecialty.SelectedValue.ToString();
classes.classId = GridView1.DataKeys[e.RowIndex].Value.ToString();
classes.className = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim();
classes.grade = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();
classes.classNo = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim();
classes.length = ((DropDownList)(GridView1.Rows[e.RowIndex].FindControl("DDLlength"))).SelectedValue.ToString();
classes.assistantId = ((DropDownList)(GridView1.Rows[e.RowIndex].FindControl("DDLassistantName"))).SelectedValue.ToString();
classes.explain = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[6].Controls[0])).Text.ToString().Trim();
bool flag = new ClassesMgr().Update(classes);
if (flag == true)
{
GridView1.EditIndex = -1;
this.GridView1_Bind();
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('班级更新失败!');</script>");
}
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
bool flag = new ClassesMgr().Delete(GridView1.DataKeys[e.RowIndex].Value.ToString());
if (flag == true)
{
this.GridView1_Bind();
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('班级删除失败!请联系管理员!');</script>");
}
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
this.GridView1_Bind();
}
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventA
rgs e)
{
GridView1.EditIndex = -1;
this.GridView1_Bind();
}
好了以上就是我的一些心得了,很高兴与大家分享,如果大家还有什么好的知识,要多多与我交流分享哦,我也要拜师学艺呀!