我现在遇到一个问题,好象很简单的:
已经得到一个DataTable dt
我现在有一些查询条件,我想从这个dt中查到想要到记录后,生成一个新的DataTable
可当我使用dt.select(where)后,返回是DataRow[]数组
我New一个新DataTable dt2以后,
foreach(DataRow row in dt)
{
dt2.Rows.Add(row);//这时报错,因为这个row是dt表的,不能被关联到dt2了
}请问以上的问题怎么办?是否还有更简单的方法??
已经得到一个DataTable dt
我现在有一些查询条件,我想从这个dt中查到想要到记录后,生成一个新的DataTable
可当我使用dt.select(where)后,返回是DataRow[]数组
我New一个新DataTable dt2以后,
foreach(DataRow row in dt)
{
dt2.Rows.Add(row);//这时报错,因为这个row是dt表的,不能被关联到dt2了
}请问以上的问题怎么办?是否还有更简单的方法??
解决方案 »
- 关于整和的项目
- asp.net 调用vcdll
- 为什么我不能预揽页面
- 关于ACCESS和SQL SERVER 2000在后台代码中添加记录区别的问题
- 初学ASP.net的第十四个问题( 更新一条数据 ) 我的分数很少,还是想请教大虾门.
- 关于SESSION的问题!?
- vs.net 能否把长长的控件声明收缩卷起来
- Windows Authentication, workgroup方式下的怪问题
- 请各位高人讨论一下.net时代中com的地位与前景,com到以后还会不会发挥想现在这样的作用啊,此贴的目的只是想让大家发表一下对未来技术走
- 请教个问题 解决马上结帖,请帮忙◎◎◎◎◎◎◎◎◎
- DataGrid 什么通过实现垂直滚动条(须要列子)(急用!谢谢高手帮助) 在线等
- 怎样从数据库中取出image(blob)字段,然后付给image控件?
然后在importRow这个方法.
查一下MSDN.
比如:
dt表里有十条数据
我还有个查询字符串,比如这个查询会从dt里查出五条
dt2=dt.Clone()后dt2还是十条记录我要dt2里只要那符合条件的五条记录就可以了。请大家再思考一下。有没有好的方法。
例子:
dim dv as dataview = ds1.tables("authors").defaultview
dv.rowfilter = "country = 'china'"
da.sort = "authorName"明白了?
DataView dv = new DataView(ds.Tables["TableName"]);
dv.RowFilter="FieldName LIKE '%" + strFieldValue + "%'"; //类似SQL的WHERE 子句的语法
对于系统中的一些基础数据,我们没有必要每次都去数据库中读取,这样会增加访问数据库的次数,大大影响效率,所以我要把基础表的数据放到内存中,然后在访问时,根据不同的条件,返回出所要的DataTable,所以出现上面我的问题。以上的回答。至今没有解决 我的问题啊。。加油啊。。大家。
你可以直接用dataview作为控件的数据源阿
接着写就是
datagride1.datasource = dv
datagride1.databind()
dv.RowFilter = "你的select(where)中where的值";
这时dv中能够访问到的记录就是你所需要的新表中的记录了。
为了与DataTable同样方式访问,可以使用
DataViewRow dr = dv[i];
这时的dr与DataTable中的DataRow在使用方法上无任何区别了。
怎么 办??
datatable dt2;...dataview dv = new dataview(dt.defaultview);
dv.rowfilter = "你的条件";
dt2 = dv.table;
return dt2;可以了么?
七小的答案是错的。因那个DataView.Table是个引用。指向的还是原来的那个DataTable
所以,得到的其实还是原来的那个dt,还是十条记录。在这个问题中体现的是引用与copy的概念吧。
可以试试使用下面的方法public static DataTable CreateTable(DataView obDataView)
{
if (null == obDataView)
{
throw new ArgumentNullException
("DataView", "Invalid DataView object specified");
} DataTable obNewDt = obDataView.Table.Clone();
int idx = 0;
string [] strColNames = new string[obNewDt.Columns.Count];
foreach (DataColumn col in obNewDt.Columns)
{
strColNames[idx++] = col.ColumnName;
} IEnumerator viewEnumerator = obDataView.GetEnumerator();
while (viewEnumerator.MoveNext())
{
DataRowView drv = (DataRowView)viewEnumerator.Current;
DataRow dr = obNewDt.NewRow();
try
{
foreach (string strName in strColNames)
{
dr[strName] = drv[strName];
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
obNewDt.Rows.Add(dr);
} return obNewDt;
}
dt是原DataTable
where是查询字符串
order是排序字符串DataRow[] drs=dt.Select(where,order);
DataTable dt2=dt.Copy();
dt2.Rows.Clear();
foreach(DataRow row in drs)
{
DataRow row2=dt2.NewRow();
for(int i=0;i<row2.Table.Columns.Count;i++)
row2[i]=row[i];
dt2.Rows.Add(row2);
}
return dt2;不过,我实在是觉得这样的方法太浪费了。因为这样的操作会相当频繁
我在想,这里面是否有个更好的。最有效率的方法解决。
因为已经得到那个Row,可是DataRow没有Clone功能。所以郁闷呢!!!
谢谢楼上的...不过,我期待能得到最有效率的代码。
dv.RowFilter="FieldName LIKE '%" + 美女 + "%'";
DataGrid.DataSource=dv;
不过刚才看了一下,好象DataTable没有公开一个可以实现这个功能的方法