简体   繁体   中英

Add Row to ASP.NET GridView?

I have the following GridView which has a couple DropDownLists and TextBoxes. How can I add a new row to it, while persisting the existing GridView. I would like to Add the New row with the LinkButton. I am not using DataSource Controls and the GridView is currently populated via a DataTable. Here is the GridView:

<asp:LinkButton ID="btnAdd" runat="server" Text="Add Room" 
        onclick="btnAdd_Click"></asp:LinkButton>
    <asp:GridView ID="gvRP" runat="server" AutoGenerateColumns="false" 
        onrowdatabound="gvRP_RowDataBound" 
        onrowediting="gvRP_RowEditing">
    <Columns>
    <asp:TemplateField HeaderText="Room" ItemStyle-Width="100%">
    <ItemTemplate>
    <asp:Label runat="server" Text="Room"></asp:Label>
    <asp:DropDownList ID="ddlRoom" runat="server" AutoPostBack="True" DataTextField="Name"
        DataValueField="Id" AppendDataBoundItems="true" OnSelectedIndexChanged="ddlRoom_SelectedIndexChanged">
        <asp:ListItem Value="-1">Select...</asp:ListItem>
    </asp:DropDownList>
    <asp:Label runat="server" AssociatedControlID="ddlRate" Text="Rate" ID="lblRate"></asp:Label><asp:DropDownList
        ID="ddlRate" runat="server" AppendDataBoundItems="true" DataTextField="Name"
        DataValueField="Id">
        <asp:ListItem Value="-1">Select...</asp:ListItem>
    </asp:DropDownList>

    <asp:Label  runat="server" Text="Adults"></asp:Label>
    <asp:TextBox ID="txtAdults" Text='<%#Bind("Adults") %>' runat="server" Width="25px"></asp:TextBox>
    <asp:Label  runat="server" Text="Children"></asp:Label>
    <asp:TextBox ID="txtChildren" Text='<%#Bind("Children") %>' runat="server"  Width="25px"></asp:TextBox>
    <asp:Label runat="server" Text="Check In"></asp:Label>
    <asp:TextBox ID="txtCheckIn" Text='<%#Bind("CheckIn") %>' runat="server" Width="75px"></asp:TextBox>
    <asp:Label  runat="server" Text="Check Out"></asp:Label>
    <asp:TextBox ID="txtCheckOut" Text='<%#Bind("CheckOut") %>' runat="server"  Width="75px"></asp:TextBox>

    <h3>Rates</h3>
    <asp:GridView ID="gvR" runat="server" AutoGenerateColumns="false">
    <Columns>
    <asp:BoundField DataField="Name" HeaderText="Rate" />
    <asp:BoundField DataField="Effective" HeaderText="Effective" />
    <asp:BoundField DataField="Expire" HeaderText="Expire" />
    <asp:BoundField DataField="Amount" HeaderText="Amount" />
    <asp:BoundField DataField="Code" HeaderText="Currency" />
    </Columns>
    </asp:GridView>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>

Usually I try and do an example, but this one is quite thorough, and I don't "think" the url is going anywhere. Please refer to this link for a comprehensive example.

Here's the important code.

grid

<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
    <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" />
</FooterTemplate>

code behind

protected void ButtonAdd_Click(object sender, EventArgs e)
{
      AddNewRowToGrid()
}

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
            }
            dtCurrentTable.Rows.Add(drCurrentRow);
            ViewState["CurrentTable"] = dtCurrentTable;

            Gridview1.DataSource = dtCurrentTable;
            Gridview1.DataBind();
        }
    }
    else
    {
        Response.Write("ViewState is null");
    }

    //Set Previous Data on Postbacks
    SetPreviousData();
}

I decided to go with this solution:

DataTable dt = new DataTable();

DataColumn dcRoom = new DataColumn("Room", typeof(DropDownList));
DataColumn dcAdults = new DataColumn("Adults", typeof(string));
DataColumn dcChildren = new DataColumn("Children", typeof(string));
DataColumn dcCheckIn = new DataColumn("CheckIn", typeof(string));
DataColumn dcCheckOut = new DataColumn("CheckOut", typeof(string));

dt.Columns.AddRange(new DataColumn[] { dcRoom, dcAdults, dcChildren, dcCheckIn, dcCheckOut });

dt.Rows.Add(new object[] { new DropDownList(), "", "", "", "" });
gvRP.DataSource = dt;
gvRP.DataBind();

How does it know What to put in the DropDown (Select...) and I haven't specified two DropDowns, yet it still puts the second DropDown.

Put Label control or Textbox as you like inside ItemTemplate if you put it at last it'll be displayed at last, for example

<ItemTemplate>
    ....
    <asp:Label Text="foo" runat="server" />
</ItemTemplate>

or

 <ItemTemplate>
    <asp:Label Text="foo" runat="server" />
     ....
 </ItemTemplate>
namespace gridview_row_add
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            DataGridViewTextBoxColumn columntype = new DataGridViewTextBoxColumn();
            columntype.HeaderText = "Type";
            columntype.Width = 80;
            dataGridView1.Columns.Add(columntype);

            DataGridViewTextBoxColumn columnparameters = new DataGridViewTextBoxColumn();
            columnparameters.HeaderText = "Parameters";
            columnparameters.Width = 320;
            dataGridView1.Columns.Add(columnparameters);

            DataGridViewTextBoxColumn columndisplay = new DataGridViewTextBoxColumn();
            columndisplay.HeaderText = "Display";
            columndisplay.Width = 150;
            dataGridView1.Columns.Add(columndisplay);

            DataGridViewTextBoxColumn enumuration = new DataGridViewTextBoxColumn();
            enumuration.HeaderText = "Format";
            enumuration.Width = 90;
            dataGridView1.Columns.Add(enumuration);

            dataGridView1.AllowUserToAddRows = false;//please add this if u don't want to add exta rows or else make it true.          
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Add();//here on each click the new row will be added.

            int rowcount = dataGridView1.Rows.Count;

            dataGridView1.Rows[rowcount - 1].Cells[0].Value = "data" + rowcount.ToString();
            dataGridView1.Rows[rowcount-1].Cells[1].Value = "field";
            dataGridView1.Rows[rowcount-1].Cells[2].Value = "xyzzz";
            dataGridView1.Rows[rowcount-1].Cells[3].Value = "hts";

            rowcount++;                     
        }
    }
}

this code works fine for me. in this code i added four headers in girdview, you can change them as per your requirement..one button click it will add new row first then data got filled in that row.. hope this will work for you..

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM