[高分在线]如何从DataTable中过滤出一个新的DataTable

tintown 2004-10-29 09:55:42
我现在遇到一个问题,好象很简单的:
已经得到一个DataTable dt
我现在有一些查询条件,我想从这个dt中查到想要到记录后,生成一个新的DataTable
可当我使用dt.select(where)后,返回是DataRow[]数组
我New一个新DataTable dt2以后,
foreach(DataRow row in dt)
{
dt2.Rows.Add(row);//这时报错,因为这个row是dt表的,不能被关联到dt2了
}

请问以上的问题怎么办?

是否还有更简单的方法??
...全文
1882 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
tintown 2004-11-01
  • 打赏
  • 举报
回复
请大家顶一顶啊。
冷月孤峰 2004-10-30
  • 打赏
  • 举报
回复
DataView dv = new DataView(ds.Tables["TableName"]);
dv.RowFilter="FieldName LIKE '%" + 美女 + "%'";
DataGrid.DataSource=dv;
tintown 2004-10-30
  • 打赏
  • 举报
回复
还请高手相助
wangrenda 2004-10-30
  • 打赏
  • 举报
回复
DataView
可以实现
qixiao 2004-10-30
  • 打赏
  • 举报
回复
对不起,没有测试乱说话,见笑了
不过刚才看了一下,好象DataTable没有公开一个可以实现这个功能的方法
tintown 2004-10-29
  • 打赏
  • 举报
回复
可以。楼上的方法是可以的。

其实我使用的是:
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功能。所以郁闷呢!!!
谢谢楼上的...不过,我期待能得到最有效率的代码。
gebing0908 2004-10-29
  • 打赏
  • 举报
回复
确实。不好意思了。
可以试试使用下面的方法

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;
}
tintown 2004-10-29
  • 打赏
  • 举报
回复
哈哈。我刚刚测试过了。
七小的答案是错的。因那个DataView.Table是个引用。指向的还是原来的那个DataTable
所以,得到的其实还是原来的那个dt,还是十条记录。

在这个问题中体现的是引用与copy的概念吧。
gebing0908 2004-10-29
  • 打赏
  • 举报
回复
DataTable dt;
datatable dt2;

...

dataview dv = new dataview(dt.defaultview);
dv.rowfilter = "你的条件";
dt2 = dv.table;
return dt2;

可以了么?
gebing0908 2004-10-29
  • 打赏
  • 举报
回复
我的加上七小的答案就足够满足你的要求了啊。
tintown 2004-10-29
  • 打赏
  • 举报
回复
楼上的,我是实现的一个接口,必须得返回DataTable..
怎么 办??
layerr 2004-10-29
  • 打赏
  • 举报
回复
DataView dv = dt.DefaultView;
dv.RowFilter = "你的select(where)中where的值";
这时dv中能够访问到的记录就是你所需要的新表中的记录了。
为了与DataTable同样方式访问,可以使用
DataViewRow dr = dv[i];
这时的dr与DataTable中的DataRow在使用方法上无任何区别了。
qixiao 2004-10-29
  • 打赏
  • 举报
回复
tb2=dv.Table.Clone()
gebing0908 2004-10-29
  • 打赏
  • 举报
回复
转换?不大明白。
你可以直接用dataview作为控件的数据源阿
接着写就是
datagride1.datasource = dv
datagride1.databind()
tintown 2004-10-29
  • 打赏
  • 举报
回复
兄弟们,至于我为何要这样,我也说一下吧:
对于系统中的一些基础数据,我们没有必要每次都去数据库中读取,这样会增加访问数据库的次数,大大影响效率,所以我要把基础表的数据放到内存中,然后在访问时,根据不同的条件,返回出所要的DataTable,所以出现上面我的问题。

以上的回答。至今没有解决 我的问题啊。。

加油啊。。大家。
coldpanth 2004-10-29
  • 打赏
  • 举报
回复
一般用SqlAdapter查询出来的都是DataSet,而DataSet中保存的又是表,你把DataSet中的那个表,不就是你需要的那个DataTable吗?
lxcc 2004-10-29
  • 打赏
  • 举报
回复
把你的DataTable装入一个DataView
DataView dv = new DataView(ds.Tables["TableName"]);
dv.RowFilter="FieldName LIKE '%" + strFieldValue + "%'"; //类似SQL的WHERE 子句的语法
tintown 2004-10-29
  • 打赏
  • 举报
回复
楼上的。那如何把这个DataView转换成那个DataTable呢?
gebing0908 2004-10-29
  • 打赏
  • 举报
回复
使用dataview
例子:
dim dv as dataview = ds1.tables("authors").defaultview
dv.rowfilter = "country = 'china'"
da.sort = "authorName"

明白了?
tintown 2004-10-29
  • 打赏
  • 举报
回复
看来我说的不够清楚啊:
比如:
dt表里有十条数据
我还有个查询字符串,比如这个查询会从dt里查出五条
dt2=dt.Clone()后dt2还是十条记录

我要dt2里只要那符合条件的五条记录就可以了。

请大家再思考一下。有没有好的方法。
加载更多回复(4)

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧