如何在asp.net C# Webform中制作像网格一样的Excel

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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。希望您了解将发生哪些变化。如果不再评论。

以上是关于如何在asp.net C# Webform中制作像网格一样的Excel的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.Net WebForm 中调用 Web API?

怎么获取提示框的返回值(C# 、asp.net、webform)

Asp.net webform 控件是不是具有像 Winforms 控件一样的最高功能?

Hello Blazor:像ASP.NET WebForm一样写代码

C# asp.net WebForm 的三层架构配合ListView实现增删改查源码

沐雪微信|asp.net 微信源码 多用户平台 c# webform 源码