天天看點

GridView動态添加新行

gridview動态添加行的原理就是用datatable增加新列然後重新綁定;

設計源碼

設計gridview代碼

<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="商品篩選類型">

<asp:TextBox ID="txtType" runat="server" Text='<%#Eval("type")%>' BorderStyle="None"></asp:TextBox>

<ItemStyle Width="100px" />

<asp:TemplateField HeaderText="修改時間">

<asp:Label runat="server" ID="lblModificationTime" Text='<%#Eval("modifiedTime")%>'

BorderStyle="None"></asp:Label>

<asp:TemplateField HeaderText="修改人">

<asp:Label runat="server" ID="lblModificationName" Text='<%#Eval("modifiedName")%>'

<asp:TemplateField HeaderText="操作">

<asp:Button ID="btnDel" runat="server" Text="删除" CommandName="delete" />

<asp:Button ID="btnEdit" runat="server" Text="修改" CommandName="Edit" />

</Columns>

</asp:GridView>

首先我們需要在初始化的時候,建立table并同時建立一個列,以便在初始化的時候就有一個新列可使用

/// <summary>

/// Init the gvFrontendTypeSetting to show

/// </summary>

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.DateTime");

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"] = DateTime.Now;

tbScratchCard.Rows[0]["modifiedName"] = ((User)Session["user"]).AccountName;

ViewState["tbCategory"] = tbScratchCard;

//Bind the table to the gridview

gvFrontendTypeSetting.DataSource = tbScratchCard;

gvFrontendTypeSetting.DataBind();

}

如果初始化的時候需要給某列進行指派,比如目前時間和目前使用者,可以給第一行的值指派,同時我們需要把建立好的datatable結構給viewstate或者session以便我們後續的新加行,删除等操作,有了上面的代碼後我們在初始化的時候就能看到我們設計的界面,同時會有一個新行已經初始化

點選新增行按鈕

/// 添加行

/// <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;

gvFrontendTypeSetting.DataSource = tbCategory;

這裡我們首先要得到我們在初始化的時候建立的datatable資料結構,然後我們獲得使用者填寫的資料,這裡主要是因為,當使用者修改資料時我們可以動态的擷取使用者修改的值,避免使用者新增加一行儲存一行所帶來的不便。把資料儲存到datatable中後我們再添加一個新行,同樣,有一些初始值我們需要給初始化出來,再新添加行之後,我們需要把資料結構賦給viewstate或者session然後和gridview綁定,這樣動态新增行就搞定了;

好吧再來一個動态删除行的code,如下

/// 删除

protected void gvFrontendTypeSetting_RowDeleting(object sender, GridViewDeleteEventArgs e)

int number =Convert.ToInt32(((TextBox)gvFrontendTypeSetting.Rows[e.RowIndex].FindControl("txtSerialNumber")).Text);

if (Convert.ToInt32(tbCategory.Rows[i]["serialNumber"])==number)

tbCategory.Rows.RemoveAt(i);

這裡是我們首先要找到gridview中能唯一标示這行資料的值,然後獲得datatable的資料結構,再根據gridview資料行的唯一标示在datatable中循環,如果某行中的某個字段的值行gridview中的行唯一标示相等,則移除目前行,同樣把修改後的資料結構綁定給viewstate或者session,然後重新綁定;

總體就是在初始化的時候需要把資料結構的建立起來,并建立一行,并把資料結構給viewstate或者session,然後如果做其他操作就需要先活動這個資料結構,再做其他的修改,同樣做完修改後需要把新的資料結構賦給viewstate或者session,以便實時更新viewstate或者session,然後綁定。

本文轉自shenzhoulong  51CTO部落格,原文連結:http://blog.51cto.com/shenzhoulong/662781,如需轉載請自行聯系原作者

繼續閱讀