C# 如何向Gridview添加新行?

C# 如何向Gridview添加新行?,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个包含3个模板字段的Gridview:1个包含DropDownList,2个包含TexBox 我设法得到GridView中的第一个空行。现在,我需要在DropDownList的SelectedIndexChanged事件上添加另一行 我怎样才能做到这一点 谢谢你的默认设置。aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> &l

我有一个包含3个模板字段的Gridview:1个包含DropDownList,2个包含TexBox

我设法得到GridView中的第一个空行。现在,我需要在DropDownList的SelectedIndexChanged事件上添加另一行

我怎样才能做到这一点


谢谢你的默认设置。aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel runat="server">
            <ContentTemplate>
                <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                    Width="317px">
                    <Columns>
                        <asp:TemplateField HeaderText="Text 1">
                            <ItemTemplate>
                                <asp:TextBox runat="server" Visible='<%# Eval("isLast") %>' ID="Text1"></asp:TextBox>
                                <asp:Label runat="server" Visible='<%# !(bool)Eval("isLast") %>' Text='<%# Eval("text1") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Text 2">
                            <ItemTemplate>
                                <asp:TextBox runat="server" Visible='<%# Eval("isLast") %>' ID="Text2"></asp:TextBox>
                                <asp:Label runat="server" Visible='<%# !(bool)Eval("isLast") %>' Text='<%# Eval("text2") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:DropDownList ID='DropDownList' Visible='<%# Eval("isLast") %>' runat="server" 
                                    onselectedindexchanged="DropDownList_SelectedIndexChanged" AutoPostBack="true">
                                    <asp:ListItem Text="Option 1" Value="1" />
                                    <asp:ListItem Text="Option 2" Value="2" />
                                    <asp:ListItem Text="Option 3" Value="3" />
                                </asp:DropDownList>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = new DataTable("table1");
            dt.Columns.Add("ID", Type.GetType("System.Int32"));
            dt.Columns.Add("text1");
            dt.Columns.Add("text2");
            dt.Columns.Add("isLast", Type.GetType("System.Boolean"));
            for (int i = 0; i < 3; i++)
            {
                dt.Rows.Add(new object[] { 
                    i, 
                    i < 2 ? "text 1 row " + i : string.Empty, 
                    i < 2 ? "text 2 row " + i : string.Empty, 
                    i == 2 });
            }
            GridView1.DataSource = dt;
            GridView1.DataBind();
            Session["dataTable"] = dt; // change to sql data source
        }
    }
    protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddl = (DropDownList)sender;
        DataTable dt = (DataTable)Session["dataTable"];
        var maxId = dt.AsEnumerable().Max(row => Convert.ToInt32(row["ID"]));
        var dataRow = dt.AsEnumerable().Where(row => (int)row["ID"] == maxId)
                        .Select(row => row)
                        .FirstOrDefault();
        dataRow["text1"] = ((TextBox)GridView1.Rows[GridView1.Rows.Count - 1].FindControl("Text1")).Text;
        dataRow["text2"] = ((TextBox)GridView1.Rows[GridView1.Rows.Count - 1].FindControl("Text2")).Text;
        dataRow["isLast"] = false;
        dt.Rows.Add(new object[] { maxId + 1, string.Empty, string.Empty, true });
        GridView1.DataSource = dt;
        GridView1.DataBind();
        Session["dataTable"] = dt;
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用系统数据;
公共部分类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
DataTable dt=新的DataTable(“表1”);
Add(“ID”,Type.GetType(“System.Int32”);
dt.列。添加(“文本1”);
dt.列。添加(“文本2”);
Add(“isLast”,Type.GetType(“System.Boolean”);
对于(int i=0;i<3;i++)
{
添加(新对象[]{
我
i<2?“文本1行”+i:string.Empty,
i<2?“文本2行”+i:string.Empty,
i==2});
}
GridView1.DataSource=dt;
GridView1.DataBind();
会话[“dataTable”]=dt;//更改为sql数据源
}
}
受保护的void DropDownList\u SelectedIndexChanged(对象发送方,事件参数e)
{
DropDownList ddl=(DropDownList)发送方;
DataTable dt=(DataTable)会话[“DataTable”];
var maxId=dt.AsEnumerable().Max(行=>Convert.ToInt32(行[“ID]”));
var dataRow=dt.AsEnumerable()。其中(row=>(int)row[“ID”]==maxId)
.选择(行=>行)
.FirstOrDefault();
dataRow[“text1”]=((文本框)GridView1.Rows[GridView1.Rows.Count-1].FindControl(“text1”).Text;
dataRow[“text2”]=((文本框)GridView1.Rows[GridView1.Rows.Count-1].FindControl(“text2”).Text;
dataRow[“isLast”]=false;
Add(新对象[]{maxId+1,string.Empty,string.Empty,true});
GridView1.DataSource=dt;
GridView1.DataBind();
会话[“数据表”]=dt;
}
}

我将丢失用户在下拉列表和文本框中输入的值。如何保存它们?将网格放入更新面板并使用javascript提交。等等,我写的代码正是我需要的!非常感谢!