【问题标题】:How to Add DataTable value in DataSet Using every foreach loop in ASP.NET C# Webform如何使用 ASP.NET C# Webform 中的每个 foreach 循环在 DataSet 中添加 DataTable 值
【发布时间】:2017-10-14 01:27:05
【问题描述】:

如何使用 ASP.NET C# Webform 中的每个 foreach 循环在 DataSet 中添加 DataTable 值,实际上我有一个 gridview 并且在 gridview 中选中的复选框数据应该只下载到 xl。

我有下面的代码用于导出到 xl 按钮。

     foreach (GridViewRow row in gv_TotalAllReg.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                bool isChecked = ((CheckBox)row.FindControl("chk_box")).Checked;
                if (isChecked == true)
                {
                    //var ds = new DataSet();
                    //var dt = new DataTable("RegistrationDetails");

                    int index = row.RowIndex;

                    bo.Para1 = "4";
                    bo.Para2 = "Innovation";

                    bo.Para3 = gv_TotalAllReg.DataKeys[index].Values[0].ToString();//Id



                }
            }
        }
        dt = bl.Admin_GetInnovationbaseonParaType(bo);
        if (gv_TotalAllReg.Rows.Count > 0)
        {
            dt.TableName = "RegistrationDetails";
            ds.Tables.Add(dt);
            ExcelHelper.ToExcel(ds, "ApplicationDetails.xls", Page.Response);
            btnExport.Visible = true;


        }

实际上基于 gridview 中选中的复选框,数据未显示在 xl 表中,只有最后选择的数据显示在 xl 表中。

我没有得到逻辑 ds.Tables.Add(dt); 在每个 foreach 循环的 ds 中添加 dt 值。我需要将所有选定的数据放入 xl 表中。为什么最后选择的数据只出现在 xl 表中。

【问题讨论】:

    标签: c# asp.net excel gridview webforms


    【解决方案1】:

    我认为您可以在foreach 循环之前创建DataTable,并在其中添加行。下面是从DataTable 添加和检索数据的示例:

    DataTable dt = bl.Admin_GetInnovationbaseonParaType(bo);
    if (gv_TotalAllReg.Rows.Count > 0)
    {
         dt.TableName = "RegistrationDetails";
         ds.Tables.Add(dt);               
    
         foreach (GridViewRow row in gv_TotalAllReg.Rows)
         {
             if (row.RowType == DataControlRowType.DataRow)
             {
                 bool isChecked = ((CheckBox)row.FindControl("chk_box")).Checked;
                 if (isChecked == true)
                 {                    
                    // inserting data row
                    dr = dt.NewRow();
                    dr.SetField("Column_Name", "your_Value");
                    dt.Rows.Add(dr);
    
                    int index = row.RowIndex;
    
                    bo.Para1 = "4";
                    bo.Para2 = "Innovation";
    
                    bo.Para3 = gv_TotalAllReg.DataKeys[index].Values[0].ToString();//Id
                 }
             }
        }
    
        ExcelHelper.ToExcel(ds, "ApplicationDetails.xls", Page.Response);
        btnExport.Visible = true;
    }
    

    检索数据:

    string[] values = dt.AsEnumerable().Select(r => r.Field<string>("Value")).ToArray();
    

    【讨论】:

    • 应该在哪里添加这个方法:dt = bl.Admin_GetInnovationbaseonParaType(bo);如果 (gv_TotalAllReg.Rows.Count > 0) 。 @daniell89
    • @mazhar124 - 更新
    【解决方案2】:

    您可以将整个 datatable 添加到 dataset,而不是将 datatable 的每一行添加到 dataset。 p>

    Dataset 可以保存 datatables 的集合,因此您可以将多个数据表添加到数据集中。

    DataTable tbl = new Datatable();//or your method that returns datatable.
    DataSet ds = new DataSet(); //new dataset object
    ds.Tables.Add(tbl); //add datatable object in dataset object.
    

    更新

     DataTable dt= new DataTable();
    //Columns that should present in datatable
    dt.Columns.Add("SN");
    dt.Columns.Add("MyField");
    int sn = 1;
    foreach (GridViewRow row in gv_TotalAllReg.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            bool isChecked = ((CheckBox)row.FindControl("chk_box")).Checked;
            if (isChecked == true)
            {
                DataRow row = dt.NewRow();
                //Add necessary columns to row by index.
                row[0] = sn;
                row[1] = gv_TotalAllReg.DataKeys[index].Values[0].ToString();   
                dt.Rows.Add(row); 
                sn++;
            }
        }
    }
    if (tbl .Rows.Count > 0)
    {
    ds.Tables.Add(dt);
    ExcelHelper.ToExcel(ds, "ApplicationDetails.xls", Page.Response);
    btnExport.Visible = true;
    }
    

    【讨论】:

    • 再次仅获取最后选择的数据,您能否根据上述问题更新完整答案。 @布班
    • 您能否根据 ID 检查我的 foreach 循环逻辑是否正确,我必须获取选择复选框数据。 @布班
    • 添加 dt = bl.Admin_GetInnovationbaseonParaType(bo);在 if (isChecked == true) 里面我猜 dt 是 DataTable 所以,你应该将行 (DataRow) 添加到 dt。如果 dt 是 Datatable,那么您现在正在做的是在 foreach 结束时使用 bo 创建新的 Datatable。如果你把它带到 foreach 里面,它每次都会创建对象,所以你会得到准确的结果,但是如果你向数据表添加行,你会得到你想要的所有记录。
    • 我添加但无法正常工作,请更新完整答案。 @布班
    • 基于参数值执行过程 bo.Para3 = gv_TotalAllReg.DataKeys[index].Values[0].ToString();//Id 值再次变得混乱,我必须在哪里添加这个 dt = bl.Admin_GetInnovationbaseonParaType(bo); . @布班
    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多