GridView動態添加新行


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM