【问题标题】:Dynamically add rows to GridView which contain web controls in ASP.NET向 GridView 动态添加行,其中包含 ASP.NET 中的 Web 控件
【发布时间】:2016-02-19 07:16:49
【问题描述】:

您好,我遇到了一个大问题,因为我不知道从哪里开始。我需要创建一个 Gridview,它下面有一个按钮,一个“创建行”按钮和一个“删除行”按钮。我希望每次按下“创建行”按钮时都会将新行添加到 GridView,但主要问题是我需要在新行中填充不同的控件,例如 DropDownLists 和 TextBox,但我不知道如何正确地做到这一点。这是我希望 GridView 的图像:

每行有 2 个下拉列表、两个文本框和一个按钮

我知道我需要将 GridView 绑定到数据源(如 dataTable),但我不知道这是否适用于 TextBox 或 DropDownLists 等控件。对不起,如果我不添加任何代码,因为我真的不知道从哪里开始。谢谢。

【问题讨论】:

  • 您需要查看<ItemTemplate> 也查看此链接stackoverflow.com/questions/11900502/… 并在How to add DropdownList to DataGridView 上进行谷歌搜索为您的TextBox 谷歌搜索做同样的事情

标签: c# asp.net gridview


【解决方案1】:

如果我理解正确,你可以按照这个:

  1. 创建网格视图

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound"
    OnRowCommand="GridView1_RowCommand" DataKeyNames="RowNumber">
    <Columns>
        <asp:BoundField DataField="RowNumber" HeaderText="Row Number" Visible="false" />
		
        <asp:TemplateField HeaderText="Select" ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkSelect"
                    ToolTip="Select To Delete This Row" />
                <asp:Label runat="server" ID="lblId" Text='<%# Bind("Id") %>'
                    Visible="false"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
		
		<asp:TemplateField HeaderText="First Entry">
            <ItemTemplate>
                <asp:Label runat="server" ID="lblFirstEntry" Visible="false" Text='<%# Eval("FirstEntry") %>'></asp:Label>
                <asp:DropDownList ID="ddlFirstEntry" runat="server" ClientIDMode="Static" CssClass="ddlFirstEntry">
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
		
		<asp:TemplateField HeaderText="Second Entry">
            <ItemTemplate>
                <asp:Label runat="server" ID="lblSecondEntry" Visible="false" Text='<%# Eval("SecondEntry") %>'></asp:Label>
                <asp:DropDownList ID="ddlSecondEntry" runat="server" ClientIDMode="Static" CssClass="ddlSecondEntry">
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
		
        <asp:TemplateField HeaderText="First Text Box">
            <ItemTemplate>
                <asp:Label runat="server" ID="lblFirstTextBox" Visible="false"></asp:Label>
                <asp:TextBox ID="txtFirstTextBox" runat="server" Text='<%# Eval("FirstTextBox") %>'
                    CssClass="txtFirstTextBox"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
		
		<asp:TemplateField HeaderText="Second Text Box">
            <ItemTemplate>
                <asp:Label runat="server" ID="lblSecondTextBox" Visible="false"></asp:Label>
                <asp:TextBox ID="txtFSecondTextBox" runat="server" Text='<%# Eval("SecondTextBox") %>'
                    CssClass="txtSecondTextBox"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
		
		<asp:TemplateField HeaderText="Second Text Box">
            <ItemTemplate>
				<asp:Button ID="btnSubmit" runat="server" Text="Button" />
			</ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
  1. 然后在Page_Load的Code后面调用这个方法

    private void InitializeGrid()
    {
        try
        {
            ViewState["applicationDetail"] = null;
    
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[]
            { 
            new DataColumn("Id", typeof(int)),
            new DataColumn("FirstEntry", typeof(string)),
            new DataColumn("SecondEntry",typeof(string)),
            new DataColumn("FirstTextBox", typeof(string)),
            new DataColumn("SecondTextBox", typeof(string))
    
            });
    
            DataRow drRow = dt.NewRow();
            drRow["Id"] = 1;
            drRow["FirstEntry"] = string.Empty;
            drRow["SecondEntry"] = string.Empty;
            drRow["FirstTextBox"] = string.Empty;
            drRow["SecondTextBox"] = string.Empty;
            dt.Rows.Add(drRow);
    
            ViewState["applicationDetail"] = dt;
            GridView1.DataSource = ViewState["applicationDetail"];
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    

初始化网格();

GridView1.DataBind();

在 GridView1_RowDataBound 上绑定你所有的下拉控件

到此为止,将创建一个包含一个空行的网格。

  1. 现在在添加按钮上单击执行以下操作

    protected void btnNewRow_Click(object sender, EventArgs e)
    {
        try
        {
            AddNewRowToGrid();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    
    private void AddNewRowToGrid()
    {
        try
        {
            int rowIndex = 0;
            if (ViewState["applicationDetail"] != null)
            {
                DataTable dtCurrentTable = (DataTable)ViewState["applicationDetail"];
    
                DataRow drCurrentRow = null;
    
                if (dtCurrentTable.Rows.Count > 0)
                {
    
                    for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                    {
                        //extract the TextBox values  _lblGuestId
                        DropDownList ddl1 = GridView1.Rows[rowIndex].FindControl("ddlFirstEntry") as DropDownList;
                        DropDownList ddl2 = GridView1.Rows[rowIndex].FindControl("ddlSecondEntry") as DropDownList;
                        TextBox txt1 = GridView1.Rows[rowIndex].FindControl("txtFirstTextBox") as TextBox;
                        TextBox txt2 = GridView1.Rows[rowIndex].FindControl("txtSecondTextBox") as TextBox;
    
                        drCurrentRow = dtCurrentTable.NewRow();
                        drCurrentRow["RowNumber"] = i + 1;
    
                        dtCurrentTable.Rows[i - 1]["FirstEntry"] = ddl1.SelectedValue;
                        dtCurrentTable.Rows[i - 1]["SecondEntry"] = ddl2.SelectedValue;
                        dtCurrentTable.Rows[i - 1]["FirstTextBox"] = txt1.Text;
                        dtCurrentTable.Rows[i - 1]["SecondTextBox"] = txt2.Text;                            
                        rowIndex++;
                    }
    
                    dtCurrentTable.Rows.Add(drCurrentRow);
                    ViewState["applicationDetail"] = dtCurrentTable;
                    GridView1.DataSource = dtCurrentTable;
                    GridView1.DataBind();
                }
            }
            else
            {
                Response.Write("ViewState is null");
            }
    
            //Set Previous Data on Postbacks
            SetPreviousData();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    
    private void SetPreviousData()
    {
        try
        {
            int rowIndex = 0;
            if (ViewState["applicationDetail"] != null)
            {
                DataTable dtCurrentTable = (DataTable)ViewState["applicationDetail"];
                if (dtCurrentTable.Rows.Count > 0)
                {
                    for (int i = 0; i < dtCurrentTable.Rows.Count; i++)
                    {
                        DropDownList ddl1 = GridView1.Rows[rowIndex].FindControl("ddlFirstEntry") as DropDownList;
                        DropDownList ddl2 = GridView1.Rows[rowIndex].FindControl("ddlSecondEntry") as DropDownList;
                        TextBox txt1 = GridView1.Rows[rowIndex].FindControl("txtFirstTextBox") as TextBox;
                        TextBox txt2 = GridView1.Rows[rowIndex].FindControl("txtSecondTextBox") as TextBox;
    
                        ddl1.SelectedValue = dtCurrentTable.Rows[i]["FirstEntry"].ToString();
                        ddl2.SelectedValue = dtCurrentTable.Rows[i]["SecondEntry"].ToString();
                        txt1.Text = dtCurrentTable.Rows[i]["FirstTextBox"].ToString();
                        txt2.Text = dtCurrentTable.Rows[i]["SecondTextBox"].ToString();
                        rowIndex++;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    
  2. 用于删除

在选中复选框时在 GridView1_RowCommand 上获取所有选中复选框行的行索引并将其保存在某个会话或应用程序变量中。

单击删除按钮时,使用该变量删除行。

希望您的问题能够得到解决。

根据您的评论,我正在为下拉绑定添加 GridView1_RowDataBound

    protected void GridView1_RowDataBound(object sender,  GridViewRowEventArgs e)
    {
        try
        {
            DropDownList ddl1 = (e.Row.FindControl("ddlFirstEntry") as DropDownList);
            Label lbl1 = (e.Row.FindControl("lblFirstEntry") as Label);

            DropDownList ddl2 = (e.Row.FindControl("ddlSecondEntry") as DropDownList);
            Label lbl2 = (e.Row.FindControl("lblSecondEntry") as Label);                


            ddl1.Items.Clear();
            ddl1.AppendDataBoundItems = true;
            ddl1.Items.Add(new ListItem("-Select-", "-1"));

            ddl1.DataSource = ViewState["ddl1datasourse"];
            ddl1.DataTextField = "Value";
            ddl1.DataValueField = "Id";
            ddl1.DataBind();
            if (ddl1.SelectedValue != string.Empty && lbl1.Text != null)
                ddl1.SelectedValue = lbl1.Text.Trim();
            else
                ddl1.SelectedValue = "-1";

            ddl2.Items.Clear();
            ddl2.AppendDataBoundItems = true;
            ddl2.Items.Add(new ListItem("-Select-", "-1"));

            ddl2.DataSource = ViewState["ddl2datasourse"];
            ddl2.DataTextField = "Value";
            ddl2.DataValueField = "Id";
            ddl2.DataBind();
            if (ddl2.SelectedValue != string.Empty && lbl2.Text != null)
                ddl2.SelectedValue = lbl2.Text.Trim();
            else
                ddl2.SelectedValue = "-1";

        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

【讨论】:

  • 您好,感谢您的回答。绑定行数据绑定的dll是什么意思?
  • 对不起我的错误我的意思是绑定你的 ddls,以清除我修改和添加的代码。
  • 别担心,非常感谢您的回答。我无法告诉你我有多感激哈哈。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多