利用ViewState和DataTable動態錄入資料
阿新 • • 發佈:2019-01-24
<%@ Page Language="C#" EnableViewState="true" %> <%@ Import Namespace="System.Data" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> private DataTable stoveTable = null; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { //建立 EmptyDataTemplate this.GridView_list.DataBind(); } } protected void GridView_list_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { String usage = DataBinder.Eval(e.Row.DataItem, "usage").ToString(); String steelKind = DataBinder.Eval(e.Row.DataItem, "steelKind").ToString(); String castingTon = DataBinder.Eval(e.Row.DataItem, "castingTon").ToString(); DropDownList x1 = e.Row.FindControl("x1") as DropDownList; DropDownList x2 = e.Row.FindControl("x2") as DropDownList; TextBox x3 = e.Row.FindControl("x3") as TextBox; x3.Text = castingTon; ListItem xx1 = x1.Items.FindByValue(usage); if (xx1 != null) xx1.Selected = true; ListItem xx2 = x2.Items.FindByValue(steelKind); if (xx2 != null) xx2.Selected = true; } } protected void LinkButton1_Click(object sender, EventArgs e) { DropDownList x1, x2; TextBox x3; if (GridView_list.Rows.Count == 0) { x1 = GridView_list.Controls[0].Controls[0].FindControl("x1") as DropDownList; x2 = GridView_list.Controls[0].Controls[0].FindControl("x2") as DropDownList; x3 = GridView_list.Controls[0].Controls[0].FindControl("x3") as TextBox; } else { GridViewRow r = GridView_list.FooterRow; x1 = r.FindControl("x1") as DropDownList; x2 = r.FindControl("x2") as DropDownList; x3 = r.FindControl("x3") as TextBox; } if (ViewState["dt"] == null) { stoveTable = new DataTable(); stoveTable.Columns.Add("usage", typeof(String)); stoveTable.Columns.Add("steelKind", typeof(String)); stoveTable.Columns.Add("castingTon", typeof(String)); } else { stoveTable = (DataTable)ViewState["dt"]; } DataRow newRow = stoveTable.NewRow(); newRow["usage"] = x1.SelectedValue; newRow["steelKind"] = x2.SelectedValue; newRow["castingTon"] = x3.Text; stoveTable.Rows.Add(newRow); ViewState["dt"] = stoveTable; this.GridView_list.DataSource = stoveTable; this.GridView_list.DataBind(); } protected void LinkButton2_Click(object sender, EventArgs e) { if (ViewState["dt"] == null) { return; } stoveTable = (DataTable)ViewState["dt"]; if (stoveTable.Rows.Count < 1) return; stoveTable.Rows.RemoveAt(stoveTable.Rows.Count - 1); ViewState["dt"] = stoveTable; this.GridView_list.DataSource = stoveTable; this.GridView_list.DataBind(); } protected void x1_SelectedIndexChanged(object sender, EventArgs e) { DropDownList x1 = sender as DropDownList; GridViewRow r = x1.Parent.Parent as GridViewRow; if (ViewState["dt"] == null) { Response.Write("Error"); return; } stoveTable = (DataTable)ViewState["dt"]; stoveTable.Rows[r.RowIndex]["usage"] = x1.SelectedValue; ViewState["dt"] = stoveTable; this.GridView_list.DataSource = stoveTable; this.GridView_list.DataBind(); } protected void x2_SelectedIndexChanged(object sender, EventArgs e) { DropDownList x2 = sender as DropDownList; GridViewRow r = x2.Parent.Parent as GridViewRow; if (ViewState["dt"] == null) { Response.Write("Error"); return; } stoveTable = (DataTable)ViewState["dt"]; stoveTable.Rows[r.RowIndex]["steelKind"] = x2.SelectedValue; ViewState["dt"] = stoveTable; this.GridView_list.DataSource = stoveTable; this.GridView_list.DataBind(); } protected void x3_TextChanged(object sender, EventArgs e) { TextBox x3 = sender as TextBox; GridViewRow r = x3.Parent.Parent as GridViewRow; if (ViewState["dt"] == null) { Response.Write("Error"); return; } stoveTable = (DataTable)ViewState["dt"]; stoveTable.Rows[r.RowIndex]["castingTon"] = x3.Text; ViewState["dt"] = stoveTable; this.GridView_list.DataSource = stoveTable; this.GridView_list.DataBind(); } </script>
<html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <asp:GridView ID="GridView_list" runat="server" ShowFooter="true" AutoGenerateColumns="false" OnRowDataBound="GridView_list_RowDataBound"> <EmptyDataTemplate> <table style="border-collapse: collapse; width: 100%" cellspacing="0" rules="all" border="1"> <tr> <th scope="col"> 選擇1 </th> <th scope="col"> 選擇2 </th> <th scope="col"> 輸入文字 </th> </tr> <tr><td> <asp:DropDownList ID="x1" runat="server"> <asp:ListItem>L0</asp:ListItem> <asp:ListItem>L1</asp:ListItem> <asp:ListItem>L2</asp:ListItem> <asp:ListItem>L3</asp:ListItem> </asp:DropDownList> </td><td> <asp:DropDownList ID="x2" runat="server"> <asp:ListItem>10#</asp:ListItem> <asp:ListItem>20#</asp:ListItem> <asp:ListItem>30#</asp:ListItem> <asp:ListItem>40#</asp:ListItem> </asp:DropDownList> </td><td> <asp:TextBox ID="x3" runat="server"></asp:TextBox> </td></tr> </table> </EmptyDataTemplate> <Columns> <asp:TemplateField HeaderText="選擇1"> <ItemTemplate> <asp:DropDownList ID="x1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="x1_SelectedIndexChanged"> <asp:ListItem>L0</asp:ListItem> <asp:ListItem>L1</asp:ListItem> <asp:ListItem>L2</asp:ListItem> <asp:ListItem>L3</asp:ListItem> </asp:DropDownList> </ItemTemplate> <FooterTemplate> <asp:DropDownList ID="x1" runat="server"> <asp:ListItem>L0</asp:ListItem> <asp:ListItem>L1</asp:ListItem> <asp:ListItem>L2</asp:ListItem> <asp:ListItem>L3</asp:ListItem> </asp:DropDownList> </FooterTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="選擇2"> <ItemTemplate> <asp:DropDownList ID="x2" runat="server" AutoPostBack="true" OnSelectedIndexChanged="x2_SelectedIndexChanged"> <asp:ListItem>10#</asp:ListItem> <asp:ListItem>20#</asp:ListItem> <asp:ListItem>30#</asp:ListItem> <asp:ListItem>40#</asp:ListItem> </asp:DropDownList> </ItemTemplate> <FooterTemplate> <asp:DropDownList ID="x2" runat="server"> <asp:ListItem>10#</asp:ListItem> <asp:ListItem>20#</asp:ListItem> <asp:ListItem>30#</asp:ListItem> <asp:ListItem>40#</asp:ListItem> </asp:DropDownList> </FooterTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="輸入文字"> <ItemTemplate> <asp:TextBox ID="x3" runat="server" AutoPostBack="true" OnTextChanged="x3_TextChanged"></asp:TextBox> </ItemTemplate> <FooterTemplate> <asp:TextBox ID="x3" runat="server"></asp:TextBox> </FooterTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:LinkButton ID="LinkButton1" runat="server" Text="新增內容" OnClick="LinkButton1_Click"></asp:LinkButton> <asp:LinkButton ID="LinkButton2" runat="server" Text="刪除內容" OnClick="LinkButton2_Click"></asp:LinkButton> </form> </body> </html>
另外一種方法:
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" %> <%@ Import Namespace="System.Data" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> private DataTable dataTable = null; protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { this.Bind(true); } } private DataTable GetDataTable() { if (ViewState["dt"] == null) { dataTable = new DataTable(); dataTable.Columns.Add("usage", typeof(String)); dataTable.Columns.Add("steelKind", typeof(String)); dataTable.Columns.Add("castingTon", typeof(String)); return dataTable; } else { return ViewState["dt"] as DataTable; } } private void Bind(bool AddBlankRow) { dataTable = GetDataTable(); if (AddBlankRow) dataTable.Rows.Add(dataTable.NewRow()); this.GridView1.DataSource = dataTable; this.GridView1.DataBind(); } protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { DropDownList x1 = e.Row.FindControl("x1") as DropDownList; DropDownList x2 = e.Row.FindControl("x2") as DropDownList; TextBox x3 = e.Row.FindControl("x3") as TextBox; String usage = DataBinder.Eval(e.Row.DataItem, "usage").ToString(); String steelKind = DataBinder.Eval(e.Row.DataItem, "steelKind").ToString(); String castingTon = DataBinder.Eval(e.Row.DataItem, "castingTon").ToString(); x3.Text = castingTon; ListItem xx1 = x1.Items.FindByValue(usage); if (xx1 != null) xx1.Selected = true; ListItem xx2 = x2.Items.FindByValue(steelKind); if (xx2 != null) xx2.Selected = true; } } protected void LinkButton1_Click(object sender, EventArgs e) { //總是取最後的一行 GridViewRow row = GridView1.Rows[GridView1.Rows.Count - 1]; DropDownList x1 = row.FindControl("x1") as DropDownList; DropDownList x2 = row.FindControl("x2") as DropDownList; TextBox x3 = row.FindControl("x3") as TextBox; dataTable = this.GetDataTable(); DataRow newRow = dataTable.NewRow(); if (dataTable.Rows.Count > 0) { newRow = dataTable.Rows[dataTable.Rows.Count - 1]; } newRow["usage"] = x1.SelectedValue; newRow["steelKind"] = x2.SelectedValue; newRow["castingTon"] = x3.Text; if (dataTable.Rows.Count == 0) { dataTable.Rows.Add(newRow); } ViewState["dt"] = dataTable; this.Bind(true); } protected void LinkButton2_Click(object sender, EventArgs e) { dataTable = this.GetDataTable(); if (dataTable.Rows.Count < 1) return; dataTable.Rows.RemoveAt(dataTable.Rows.Count - 1); ViewState["dt"] = dataTable; this.Bind(false); } protected void x1_SelectedIndexChanged(object sender, EventArgs e) { DropDownList x1 = sender as DropDownList; GridViewRow r = x1.Parent.Parent as GridViewRow; dataTable = this.GetDataTable(); dataTable.Rows[r.RowIndex]["usage"] = x1.SelectedValue; ViewState["dt"] = dataTable; this.Bind(false); } protected void x2_SelectedIndexChanged(object sender, EventArgs e) { DropDownList x2 = sender as DropDownList; GridViewRow r = x2.Parent.Parent as GridViewRow; dataTable = this.GetDataTable(); dataTable.Rows[r.RowIndex]["steelKind"] = x2.SelectedValue; ViewState["dt"] = dataTable; this.Bind(false); } protected void x3_TextChanged(object sender, EventArgs e) { TextBox x3 = sender as TextBox; GridViewRow r = x3.Parent.Parent as GridViewRow; dataTable = this.GetDataTable(); dataTable.Rows[r.RowIndex]["castingTon"] = x3.Text; ViewState["dt"] = dataTable; this.Bind(false); } protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { if (e.Row.RowIndex < this.GetDataTable().Rows.Count - 1) { DropDownList x1 = e.Row.FindControl("x1") as DropDownList; DropDownList x2 = e.Row.FindControl("x2") as DropDownList; TextBox x3 = e.Row.FindControl("x3") as TextBox; x1.AutoPostBack = x2.AutoPostBack = x3.AutoPostBack = true; x1.SelectedIndexChanged += new EventHandler(x1_SelectedIndexChanged); x2.SelectedIndexChanged += new EventHandler(x2_SelectedIndexChanged); x3.TextChanged += new EventHandler(x3_TextChanged); } } } </script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound"
OnRowCreated="GridView1_RowCreated">
<Columns>
<asp:TemplateField HeaderText="選擇1">
<ItemTemplate>
<asp:DropDownList ID="x1" runat="server">
<asp:ListItem>L0</asp:ListItem>
<asp:ListItem>L1</asp:ListItem>
<asp:ListItem>L2</asp:ListItem>
<asp:ListItem>L3</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="選擇2">
<ItemTemplate>
<asp:DropDownList ID="x2" runat="server">
<asp:ListItem>10#</asp:ListItem>
<asp:ListItem>20#</asp:ListItem>
<asp:ListItem>30#</asp:ListItem>
<asp:ListItem>40#</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="輸入文字">
<ItemTemplate>
<asp:TextBox ID="x3" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:LinkButton ID="LinkButton1" runat="server" Text="新增內容" OnClick="LinkButton1_Click"></asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" Text="刪除內容" OnClick="LinkButton2_Click"></asp:LinkButton>
</form>
</body>
</html>