在本文中,我将解释如何使用c#在asp.net的网格视图中动态添加带有模板字段的行。
为此,您将需要编写3个函数。
假设我们有一个网格视图,将在其中添加主题,注释,发言人姓名,时间,顺序,特定事件的开始和结束。
这是GridView的ASP.NET代码:
<asp:GridView ID="gvSpeakersAgenda" runat ="server"
AutoGenerateColumns ="false" Width ="100%"
GridLines="None" CssClass="mGrid"
PagerStyle-CssClass="pgr"
AlternatingRowStyle-CssClass="alt"
HeaderStyle-CssClass="headercss">
<Columns>
<asp:TemplateField HeaderText ="Order">
<ItemTemplate>
<asp:TextBox ID ="txtOrder" ReadOnly ="true" runat ="server" Width ="40px"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="Subject">
<ItemTemplate>
<asp:TextBox ID="txtSubject" Width ="145px" runat ="server" TextMode ="MultiLine"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="Speaker">
<ItemTemplate>
<asp:DropDownList ID ="ddlSpeakers" runat="server"></asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="Time">
<ItemTemplate>
<asp:TextBox ID="txtTime" runat ="server" Width ="60px"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="Note">
<ItemTemplate>
<asp:TextBox ID="txtNote" Width ="145px" runat ="server" TextMode ="MultiLine"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="Start" Visible ="false">
<ItemTemplate>
<asp:TextBox ID="txtStart" runat ="server" Width ="100px" ReadOnly ="true"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText ="End" Visible="false">
<ItemTemplate >
<asp:TextBox ID ="txtEnd" runat ="server" Width ="100px" ReadOnly ="true"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我们将编写以下三个函数。
private void SetInitialRow()
{
DataTable dt = new DataTable();
DataRow dr = null;
dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
dt.Columns.Add(new DataColumn("Subject", typeof(string)));
dt.Columns.Add(new DataColumn("Speaker", typeof(string)));
dt.Columns.Add(new DataColumn("Time", typeof(string)));
dt.Columns.Add(new DataColumn("Note", typeof(string)));
dt.Columns.Add(new DataColumn("Order", typeof(string)));
dt.Columns.Add(new DataColumn("Start", typeof(string)));
dt.Columns.Add(new DataColumn("End", typeof(string)));
dr = dt.NewRow();
dr["RowNumber"] = 1;
dr["Subject"] = string.Empty;
dr["Speaker"] = string.Empty;
dr["Time"] = string.Empty;
dr["Note"] = string.Empty;
dr["Order"] = string.Empty;
dr["Start"] = string.Empty;
dr["End"] = string.Empty;
dt.Rows.Add(dr);
ViewState["CurrentTable"] = dt;
gvSpeakersAgenda.DataSource = dt;
gvSpeakersAgenda.DataBind();
}
然后像这样编写添加新行的方法
private void AddNewRowToGrid()
{
int rowIndex = 0;
if (ViewState["CurrentTable"] != null)
{
DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
DataRow drCurrentRow = null;
if (dtCurrentTable.Rows.Count > 0)
{
for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
{
//extract the TextBox values
TextBox txtSubject = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[0].FindControl("txtSubject");
DropDownList ddlSpeakers = (DropDownList)gvSpeakersAgenda.Rows[rowIndex].Cells[1].FindControl("ddlSpeakers");
TextBox txtTime = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[2].FindControl("txtTime");
TextBox txtNote = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[3].FindControl("txtNote");
TextBox txtOrder = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[4].FindControl("txtOrder");
TextBox txtStart = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[5].FindControl("txtStart");
TextBox txtEnd = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[6].FindControl("txtEnd");
drCurrentRow = dtCurrentTable.NewRow();
drCurrentRow["Subject"] = txtSubject.Text;
drCurrentRow["Speaker"] = ddlSpeakers.Text;
drCurrentRow["Time"] = txtTime.Text;
drCurrentRow["Note"] = txtNote.Text;
// int order = Convert.ToInt32(txtOrder.Text);
drCurrentRow["Order"] = txtOrder.Text;
drCurrentRow["Start"] = txtStart.Text;
drCurrentRow["End"] = txtEnd.Text;
//drCurrentRow["Order"] = order + 1;
rowIndex++;
txtSubject.Focus();
txtOrder.ReadOnly = true;
}
//add new row to DataTable
dtCurrentTable.Rows.Add(drCurrentRow);
//Store the current data to ViewState
ViewState["CurrentTable"] = dtCurrentTable;
//Rebind the Grid with the current data
gvSpeakersAgenda.DataSource = dtCurrentTable;
gvSpeakersAgenda.DataBind();
}
}
else
{
Response.Write("ViewState is null");
}
//Set Previous Data on Postbacks
SetPreviousData();
}
SetPreviousData()方法将如下所示
private void SetPreviousData()
{
int rowIndex = 0;
if (ViewState["CurrentTable"] != null)
{
DataTable dt = (DataTable)ViewState["CurrentTable"];
if (dt.Rows.Count > 0)
{
for (int i = 1; i < dt.Rows.Count; i++)
{
TextBox txtSubject = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[0].FindControl("txtSubject");
DropDownList ddlSpeakers = (DropDownList)gvSpeakersAgenda.Rows[rowIndex].Cells[1].FindControl("ddlSpeakers");
TextBox txtTime = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[2].FindControl("txtTime");
TextBox txtNote = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[3].FindControl("txtNote");
TextBox txtOrder = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[4].FindControl("txtOrder");
TextBox txtStart = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[5].FindControl("txtStart");
TextBox txtEnd = (TextBox)gvSpeakersAgenda.Rows[rowIndex].Cells[6].FindControl("txtEnd");
txtSubject.Text = dt.Rows[i]["Subject"].ToString();
ddlSpeakers.Text = dt.Rows[i]["Speaker"].ToString();
txtTime.Text = dt.Rows[i]["Time"].ToString();
txtNote.Text = dt.Rows[i]["Note"].ToString();
txtOrder.Text = dt.Rows[i]["Order"].ToString();
txtStart.Text = dt.Rows[i]["Start"].ToString();
txtEnd.Text = dt.Rows[i]["End"].ToString();
txtOrder.ReadOnly = true;
rowIndex++;
}
}
}
}
现在放置一个按钮,并在该按钮的click事件上只需调用方法AddNewRowToGrid()
From: https://bytes.com/topic/asp-net/insights/942055-how-add-new-row-gridview-dynamically