码迷,mamicode.com
首页 > 其他好文 > 详细

GridView动态添加新行

时间:2015-01-17 17:43:31      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

gridview动态添加行的原理就是用datatable增加新列然后重新绑定;

设计源码

设计gridview代码:

<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" style="margin-bottom: 0px" />

<asp:GridView ID="gvFrontendTypeSetting" runat="server" AutoGenerateColumns="false"
CssClass="table" OnRowDeleting="gvFrontendTypeSetting_RowDeleting">
<Columns>
<asp:TemplateField HeaderText="序号">
<ItemTemplate>
<div align="center">
<asp:TextBox ID="txtSerialNumber" runat="server" Width="20px" Text=‘<%#Eval("serialNumber")%>‘
BorderStyle="None"></asp:TextBox>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="商品筛选类型">
<ItemTemplate>
<asp:TextBox ID="txtType" runat="server" Text=‘<%#Eval("type")%>‘ BorderStyle="None"></asp:TextBox>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>
<asp:TemplateField HeaderText="修改时间">
<ItemTemplate>
<div align="center">
<asp:Label runat="server" ID="lblModificationTime" Text=‘<%#Eval("modifiedTime")%>‘
BorderStyle="None"></asp:Label>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="修改人">
<ItemTemplate>
<div align="center">
<asp:Label runat="server" ID="lblModificationName" Text=‘<%#Eval("modifiedName")%>‘
BorderStyle="None"></asp:Label>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="操作">
<ItemTemplate>
<div align="center">
<asp:Button ID="btnDel" runat="server" Text="删除" CommandName="delete" />
<asp:Button ID="btnEdit" runat="server" Text="修改" CommandName="Edit" />
</div>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>

首先我们需要在初始化的时候,新建table并同时新建一个列,以便在初始化的时候就有一个新列可使用

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitGVFrontendTypeSetting();
}
}
private void InitGVFrontendTypeSetting()
{
//Create a datatable instance
DataTable tbScratchCard = new DataTable();
//column one
DataColumn colSerialNumber = new DataColumn();
colSerialNumber.DataType = System.Type.GetType("System.Int32");
colSerialNumber.ColumnName = "serialNumber";
//column two
DataColumn colType = new DataColumn();
colType.DataType = System.Type.GetType("System.String");
colType.ColumnName = "type";
//column three
DataColumn colModifiedTime = new DataColumn();
colModifiedTime.DataType = System.Type.GetType("System.String");
colModifiedTime.ColumnName = "modifiedTime";
//column four
DataColumn colModifiedName = new DataColumn();
colModifiedName.DataType = System.Type.GetType("System.String");
colModifiedName.ColumnName = "modifiedName";

//DataColumnCollection
DataColumn[] cols = { colSerialNumber, colType, colModifiedTime, colModifiedName };
//Add columns to the table tbScratchCard
tbScratchCard.Columns.AddRange(cols);
//Add a new row to the table tbScratchCard
//tbScratchCard.Rows.Add(tbScratchCard.NewRow());
//tbScratchCard.Rows[0]["serialNumber"] = tbScratchCard.Rows.Count - 1;
//tbScratchCard.Rows[0]["modifiedTime"] = this.TextBox1.Text;
//tbScratchCard.Rows[0]["modifiedName"] =this.TextBox2.Text;
ViewState["tbCategory"] = tbScratchCard;
//Bind the table to the gridview
gvFrontendTypeSetting.DataSource = tbScratchCard;
gvFrontendTypeSetting.DataBind();
}

如果初始化的时候需要给某列进行赋值,比如当前时间和当前用户,可以给第一行的值赋值,同时我们需要把建立好的datatable结构给viewstate或者session以便我们后续的新加行,删除等操作,有了上面的代码后我们在初始化的时候就能看到我们设计的界面,同时会有一个新行已经初始化

点击新增行按钮

 /// <summary>
    /// 添加行
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnAddType_Click(object sender, EventArgs e)
    {
        DataTable tbCategory = (DataTable)ViewState["tbCategory"];
        for (int i = 0; i <= tbCategory.Rows.Count - 1; i++)
        {
            tbCategory.Rows[i]["serialNumber"] = Convert.ToInt32(((TextBox)gvFrontendTypeSetting.Rows[i].Cells[0].FindControl("txtSerialNumber")).Text);
            tbCategory.Rows[i]["type"] = ((TextBox)gvFrontendTypeSetting.Rows[i].Cells[0].FindControl("txtType")).Text;
            tbCategory.Rows[i]["modifiedTime"] = ((Label)gvFrontendTypeSetting.Rows[i].Cells[0].FindControl("lblModificationTime")).Text;
            tbCategory.Rows[i]["modifiedName"] = ((Label)gvFrontendTypeSetting.Rows[i].Cells[0].FindControl("lblModificationName")).Text;
        }
            //Add new row
        tbCategory.Rows.Add(tbCategory.NewRow());
        tbCategory.Rows[tbCategory.Rows.Count - 1]["serialNumber"] = tbCategory.Rows.Count - 1;
        tbCategory.Rows[tbCategory.Rows.Count - 1]["modifiedTime"] = DateTime.Now;
        tbCategory.Rows[tbCategory.Rows.Count - 1]["modifiedName"] = ((User)Session["user"]).AccountName;
        ViewState["tbCategory"] = tbCategory;
        //Bind the table to the gridview
        gvFrontendTypeSetting.DataSource = tbCategory;
        gvFrontendTypeSetting.DataBind();
    }

这里我们首先要得到我们在初始化的时候建立的datatable数据结构,然后我们获得用户填写的数据,这里主要是因为,当用户修改数据时我们可以动态的获取用户修改的值,避免用户新增加一行保存一行所带来的不便。把数据保存到datatable中后我们再添加一个新行,同样,有一些初始值我们需要给初始化出来,再新添加行之后,我们需要把数据结构赋给viewstate或者session然后和gridview绑定,这样动态新增行就搞定了;

 

好吧再来一个动态删除行的code,如下

 /// <summary>
    /// 删除
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvFrontendTypeSetting_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
       
        int number =Convert.ToInt32(((TextBox)gvFrontendTypeSetting.Rows[e.RowIndex].FindControl("txtSerialNumber")).Text);
         DataTable tbCategory = (DataTable)ViewState["tbCategory"];
         for (int i = 0; i <= tbCategory.Rows.Count - 1; i++)
         {
             if (Convert.ToInt32(tbCategory.Rows[i]["serialNumber"])==number)
             {
                 tbCategory.Rows.RemoveAt(i);
             }
         }
         ViewState["tbCategory"] = tbCategory;
         gvFrontendTypeSetting.DataSource = tbCategory;
         gvFrontendTypeSetting.DataBind();
    }

这里是我们首先要找到gridview中能唯一标示这行数据的值,然后获得datatable的数据结构,再根据gridview数据行的唯一标示在datatable中循环,如果某行中的某个字段的值行gridview中的行唯一标示相等,则移除当前行,同样把修改后的数据结构绑定给viewstate或者session,然后重新绑定;

 

总体就是在初始化的时候需要把数据结构的建立起来,并新建一行,并把数据结构给viewstate或者session,然后如果做其他操作就需要先活动这个数据结构,再做其他的修改,同样做完修改后需要把新的数据结构赋给viewstate或者session,以便实时更新viewstate或者session,然后绑定。

引用:http://www.cnblogs.com/shenzhoulong/archive/2011/09/12/2174038.html

GridView动态添加新行

标签:

原文地址:http://www.cnblogs.com/hqhouse/p/4230599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!