Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataTable似乎丢失了数据_C#_Asp.net_Datatable_Webforms - Fatal编程技术网

C# DataTable似乎丢失了数据

C# DataTable似乎丢失了数据,c#,asp.net,datatable,webforms,C#,Asp.net,Datatable,Webforms,当我认为我正在向数据表添加列时,我是否过度编写了数据表?我知道,如果我在我的_FinishButton()事件中写入输出窗口,我的结果就在那里,但是当我在pushdatatosql()方法中写入输出时,它是空的。我将Datatable描述为类变量 我在这里错误地编码了什么 DataTable dtResult = new DataTable(); protected void FinishBtn_Click(object sender, EventArgs e) { pushdatat

当我认为我正在向数据表添加列时,我是否过度编写了数据表?我知道,如果我在我的_FinishButton()事件中写入输出窗口,我的结果就在那里,但是当我在pushdatatosql()方法中写入输出时,它是空的。我将Datatable描述为类变量

我在这里错误地编码了什么

DataTable dtResult = new DataTable();

protected void FinishBtn_Click(object sender, EventArgs e)
{
    pushdatatosql();
}

protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
    DataRow dr = null;
    dtResult.Columns.Add(new DataColumn("mainevent", typeof(string)));
    dtResult.Columns.Add(new DataColumn("secondevent", typeof(string)));

    foreach (GridViewRow gr in grdOther.Rows)
    {
        dr = dtResult.NewRow();
        TextBox box1 = (TextBox)gr.Cells[1].FindControl("txtmainevent");
        TextBox box2 = (TextBox)gr.Cells[2].FindControl("txtse");

        dr["mainevent"] = box1.Text;
        dr["secondevent"] = box2.Text;

        dtResult.Rows.Add(dr);
    }
}


protected void pushdatatosql()
{
    foreach (DataRow dataRow in dtResult.Rows)
    {
        foreach (var item in dataRow.ItemArray)
        {
            System.Diagnostics.Debug.WriteLine(item);
        }
    }

    using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLString"].ConnectionString))
    {
        connection.Open();
        using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
        {
            foreach (DataColumn c in dtResult.Columns)
                bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);

            bulkCopy.DestinationTableName = "TestInsertTable";
                bulkCopy.WriteToServer(dtResult);
        }
    }
}

您引用的
dtResult
类变量仅在请求期间有效。因此,对于您在页面中进行的每一次回发,都将创建该类和该类成员的新实例。在Webforms中,“卸载事件在页面完全呈现、发送到客户端并准备丢弃后引发。”。此时,您的类变量及其所包含的任何值都将被销毁


要解决此问题,可以尝试将值存储在视图状态。因此在winforms中这是完全可以接受的,但由于这是webforms,我必须使用view state?正确,Windows窗体中的生命周期允许您在类中存储跨事件持久化的值。因为Webforms是web应用程序,所以它的工作方式不同。viewstate或会话变量是保存datatable的最佳选择吗?@BoJackHorseman您不需要使用viewstate,您可以使用会话、数据库或任何持久性机制。@Crowcoder这些也可以。有很多方法可以解决这个问题。每一个新的WebForms开发人员的到来几乎总是一个难题across@mason-你会建议我怎么做?请不要重复我之前关于不使用DataTables的陈述。我向下滚动看到您正在使用SqlBulkCopy。这是数据表的合法用途。