如何将datarow复制到新的datatable中?-VB.Net

如何将datarow复制到新的datatable中?-VB.Net,vb.net,Vb.net,我试图将一个DataRow复制到一个新的DataTable中,然后在GridView中显示它,但我一直遇到问题 Dim r As DataRow() = dt.Select("MacID = 'A06'") Dim dt2 As DataTable dt2.ImportRow(r) 'this is where problem begins GridView2.DataSource = dt2 GridView2.DataBind() DataRow来自另一个DataTable,当我将鼠标

我试图将一个DataRow复制到一个新的DataTable中,然后在GridView中显示它,但我一直遇到问题

Dim r As DataRow() = dt.Select("MacID = 'A06'")

Dim dt2 As DataTable
dt2.ImportRow(r) 'this is where problem begins

GridView2.DataSource = dt2
GridView2.DataBind()
DataRow来自另一个DataTable,当我将鼠标悬停到问题行时,它会显示

Value of type '1-dimensional array of System.Data.DataRow' cannot be converted to 'System.Data.DataRow'
就我的一生而言,我不知道这意味着什么,也不知道这是否正确(可能不是)。请帮忙

编辑1: 在jmcilhinney的回复之后,我尝试了他的第二个代码,因为有多行。但我对代码有一些问题:

Dim dt2 as DataTable

Dim rows = dt.Select("MacID = 'A06'")

        For Each row In rows
            dt2.ImportRow(row) 'Problem shown here
        Next

        GridView2.DataSource = dt2
        GridView2.DataBind()
当我再次将鼠标悬停在上面时,错误显示:

Variable 'dt2' is used before it has been assigned a value.
A null reference exception could result at runtime.

DataTable.Select方法返回匹配行的数组,而不是一行
ImportRow
将只导入一行。你问题的具体解决方案取决于你想要达到的目标

如果您试图按键查找一行,则应调用
行。查找
而不是
选择
,例如

Dim row = sourceTable.Rows.Find(keyValue)

If row IsNot Nothing
    destinationTable.ImportRow(row)
End If
Dim view As New DataView(sourceTable,
                         filterExpression,
                         Nothing,
                         DataViewRowState.CurrentRows)
如果可能存在多个匹配项,则使用
选择
,但必须循环遍历结果数组,例如

Dim rows = sourceTable.Select(filterExpression)

For Each row In rows
    destinationTable.ImportRow(row)
Next
也就是说,您真的需要另一个
DataTable
?您能否在现有的
数据表
上创建
数据视图

Dim row = sourceTable.Rows.Find(keyValue)

If row IsNot Nothing
    destinationTable.ImportRow(row)
End If
Dim view As New DataView(sourceTable,
                         filterExpression,
                         Nothing,
                         DataViewRowState.CurrentRows)

DataView
可以绑定到
DataTable
可以绑定到的任何地方,事实上,当绑定
DataTable
时,数据实际上来自
DefaultView
属性,该属性的类型为
DataView

DataTable。Select
方法返回一个匹配行的数组,而不是一行
ImportRow
将只导入一行。你问题的具体解决方案取决于你想要达到的目标

如果您试图按键查找一行,则应调用
行。查找
而不是
选择
,例如

Dim row = sourceTable.Rows.Find(keyValue)

If row IsNot Nothing
    destinationTable.ImportRow(row)
End If
Dim view As New DataView(sourceTable,
                         filterExpression,
                         Nothing,
                         DataViewRowState.CurrentRows)
如果可能存在多个匹配项,则使用
选择
,但必须循环遍历结果数组,例如

Dim rows = sourceTable.Select(filterExpression)

For Each row In rows
    destinationTable.ImportRow(row)
Next
也就是说,您真的需要另一个
DataTable
?您能否在现有的
数据表
上创建
数据视图

Dim row = sourceTable.Rows.Find(keyValue)

If row IsNot Nothing
    destinationTable.ImportRow(row)
End If
Dim view As New DataView(sourceTable,
                         filterExpression,
                         Nothing,
                         DataViewRowState.CurrentRows)

DataView
可以绑定到
DataTable
可以绑定到的任何地方,事实上,当您绑定
DataTable
时,数据实际上来自
DefaultView
属性,类型为
DataView
。那么我可以使用什么来允许多行呢。因为
A06
应该有7行数据。因为我需要那个数据表来生成饼图。如果我只参考现有的
数据表
,它将变成一团混乱。GridView只供我测试数据是否正确。我在上面编辑了一些附加问题。请看一看,我明白了。那么我可以使用什么来允许多行呢。因为
A06
应该有7行数据。因为我需要那个数据表来生成饼图。如果我只参考现有的
数据表
,它将变成一团混乱。GridView只供我测试数据是否正确。我在上面编辑了一些附加问题。请看一看。如错误消息所示,在调用
ImportRow
方法之前,您没有为
dt2
变量赋值。您声明了变量,但从未实际创建
DataTable
对象,也从未向其添加任何列。您必须手动执行此操作,或者在现有的
DataTable
上调用
Clone
。正如我在回答中所建议的,最好只在现有的
数据表上创建一个
数据视图
,但我已经尝试过了。虽然它可以在我的GridView上运行,但我的饼图仍然乱七八糟。我不太会(如果有的话)绘制图表,所以我不确定图表如何处理
数据视图
,但如果它与
数据表
有什么不同,我会感到惊讶。
DataView
肯定适用于
GridView
,这就是您在这里询问的问题。如果您对将
DataView
与图表控件一起使用还有其他问题,那么您应该单独发布,或者您可以按照我所述创建另一个
DataTable
。这很公平。事实上,我已经发布了这个问题。只是我做了一些测试,遇到了这个问题,不得不问一个问题来得到答案。是的,我的编程能力很差……正如错误消息所示,在调用
ImportRow
方法之前,您没有为
dt2
变量赋值。您声明了变量,但从未实际创建
DataTable
对象,也从未向其添加任何列。您必须手动执行此操作,或者在现有的
DataTable
上调用
Clone
。正如我在回答中所建议的,最好只在现有的
数据表上创建一个
数据视图
,但我已经尝试过了。虽然它可以在我的GridView上运行,但我的饼图仍然乱七八糟。我不太会(如果有的话)绘制图表,所以我不确定图表如何处理
数据视图
,但如果它与
数据表
有什么不同,我会感到惊讶。
DataView
肯定适用于
GridView
,这就是您在这里询问的问题。如果您对将
DataView
与图表控件一起使用还有其他问题,那么您应该单独发布,或者您可以按照我所述创建另一个
DataTable
。这很公平。事实上,我已经发布了这个问题。只是我做了一些测试,遇到了这个问题,不得不问一个问题来得到答案。是的,我很不擅长编程。。。