【问题标题】:How can I make Excel like grid in asp.net C# Webform如何在asp.net C# Webform中制作像网格一样的Excel
【发布时间】:2015-05-16 08:10:52
【问题描述】:

如何在 ASP.NET WebForms 中制作类似于 Excel 中的网格?

我想要用户可以输入数据的行和列,点击保存按钮后,数据将被插入到数据库中。

【问题讨论】:

    标签: asp.net gridview datagridview webforms


    【解决方案1】:

    希望这将帮助您满足您的要求。这里我只提供 aspx 和 c# 编码。创建和修改您的数据库并相应地更改代码。这里我使用直接插入语句,您可以使用存储过程。

    数据库中的表:-

    page.aspx :-

    <asp:GridView ID="excelgrd" runat="server" AutoGenerateColumns="false" ShowFooter="true">
                <Columns>
                    <asp:BoundField DataField="Slno" HeaderText="SL No" />
                    <asp:TemplateField HeaderText="Name">
                        <ItemTemplate>
                            <asp:TextBox ID="txnm" runat="server"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                     <asp:TemplateField HeaderText="Description">
                        <ItemTemplate>
                            <asp:TextBox ID="txdesc" runat="server"></asp:TextBox>
                        </ItemTemplate>
                          <FooterStyle HorizontalAlign="Right" />
                          <FooterTemplate>
                           <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" OnClick="ButtonAdd_Click" />
                          </FooterTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
            <asp:Button ID="svbtn" runat="server" Text="Save" OnClick="svbtn_Click" />`
    

    页面后面的代码:-

    `

    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBCS"].ToString());
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
            {
                 bindgrd();//bind your grid
            }
        }
        private void bindgrd()
        {
            DataTable dt = new DataTable();
            DataRow dr = null;
            dt.Columns.Add(new DataColumn("Slno", typeof(string)));
            dt.Columns.Add(new DataColumn("Name", typeof(string)));
            dt.Columns.Add(new DataColumn("Desc", typeof(string)));
            dr = dt.NewRow();
            dr["Slno"] = 1;
            dr["Name"] = string.Empty;
            dr["Desc"] = string.Empty;
            dt.Rows.Add(dr);
            //Store the DataTable in ViewState
            ViewState["CurrentTable"] = dt;
            excelgrd.DataSource = dt;
            excelgrd.DataBind();
        }
        protected void addnewrow()
        {
            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 tx1 = (TextBox)excelgrd.Rows[rowIndex].Cells[1].FindControl("txnm");
                        TextBox tx2 = (TextBox)excelgrd.Rows[rowIndex].Cells[2].FindControl("txdesc");
    
                        drCurrentRow = dtCurrentTable.NewRow();
                        drCurrentRow["Slno"] = i + 1;
    
                        dtCurrentTable.Rows[i - 1]["Name"] = tx1.Text;
                        dtCurrentTable.Rows[i - 1]["Desc"] = tx2.Text;
    
                        rowIndex++;
                    }
                    dtCurrentTable.Rows.Add(drCurrentRow);
                    ViewState["CurrentTable"] = dtCurrentTable;
    
                    excelgrd.DataSource = dtCurrentTable;
                    excelgrd.DataBind();
                }
            }
            else
            {
                Response.Write("ViewState is null");
            }
    
            //Set Previous Data on Postbacks
            SetPreviousData();
        }
        private void SetPreviousData()
        {
            int rowIndex = 0;
            if (ViewState["CurrentTable"] != null)
            {
                DataTable dt = (DataTable)ViewState["CurrentTable"];
                if (dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        TextBox tx1 = (TextBox)excelgrd.Rows[rowIndex].Cells[1].FindControl("txnm");
                        TextBox tx2 = (TextBox)excelgrd.Rows[rowIndex].Cells[2].FindControl("txdesc");
                        tx1.Text = dt.Rows[i]["Name"].ToString();
                        tx2.Text = dt.Rows[i]["Desc"].ToString();
    
                        rowIndex++;
                    }
                }
            }
        }
        protected void svbtn_Click(object sender, EventArgs e)
        {
            foreach(GridViewRow r in excelgrd.Rows)
            {
              string des =(r.FindControl("txdesc") as TextBox).Text;
              string nm = (r.FindControl("txnm") as TextBox).Text;
              try
              {
                  con.Open();
                  SqlCommand sql = new SqlCommand("insert into test (name,name_desc) values('"+nm+"','"+des+"')", con);
                  sql.ExecuteNonQuery();
                  sql.Dispose();
              }
              catch (Exception e1)
              {
                  string error = e1.ToString();
              }
              finally
              {
                  con.Close();
    
              }
    
            }
        }
        protected void ButtonAdd_Click(object sender, EventArgs e)
        {
            addnewrow();
        }`
    

    【讨论】:

    • 感谢兄弟,现在非常有帮助,我只想再问一件事,我可以针对一个 id 存储不同的行数据
    • 欢迎您。是的,您可以针对一个 id 存储数据,此处来自 gridview 的 slno 未保存在表中。表有一个自动生成的列 ID。一件事我是女性用户。
    • 是的,非常感谢您帮助我
    • 非常感谢。但是,如果我要使用复选框而不是文本框?在 addnewrow()、svbtn_Click 和 SetPreviousData() 的代码中,应该使用哪些命令来替换 .Text、.ToString 等。希望你能帮助我谢谢
    • 所以对于CheckBox,您的列类型将为bool,在addnewrow() , svbtn_Click, and SetPreviousData()中,使用.checked。希望您了解将发生哪些变化。如果不再评论。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2016-01-28
    • 2023-02-11
    相关资源
    最近更新 更多