3 回答
![?](http://img1.sycdn.imooc.com/545868b60001587202200220-100-100.jpg)
TA贡献2011条经验 获得超2个赞
您当前正在使用该WriteLine方法的以下重载:
public virtual void WriteLine(object value)
如果您查看StreamWriter.WriteLine(object)的文档,它会说:
通过调用对象上的ToString方法写入对象的文本表示,后跟行终止符到文本字符串或流。
这就是您在文件中得到以下漂亮行的原因:
System.Windows.Controls.ItemCollection
Object.ToString()方法的文档显示
Object.ToString 方法的默认实现返回对象类型的完全限定名称。
您需要遍历集合并将每个条目分别写入文件。我还建议直接使用数据源,而不是从DataGrid.
foreach (DataRow row in dt.Rows)
{
object[] array = row.ItemArray;
writer.WriteLine(string.Join(" | ", array));
}
![?](http://img1.sycdn.imooc.com/5458464a00013eb602200220-100-100.jpg)
TA贡献2051条经验 获得超10个赞
这是因为data.Items是一个ItemCollection而不是一个字符串。
ToString当要求将其内容表示为字符串时,所有对象都返回其方法的输出。通常你会使用override这种方法,但在这种情况下你不能。
因此,您需要告诉编译器如何从该集合中检索代表性信息。您可以使用以下任一查询从数据网格中获取所需信息:
var items = data.Items.AsQueryable().Cast<MyItemDataType>().Select(x => x.MyProperty);
var items = data.ItemsSource.Cast<MyItemDataType>().Select(x => x.MyProperty);
var items = data.Items.SourceCollection.AsQueryable().Cast<MyItemDataType>().Select(x => x.MyProperty);
items 是一个集合,因此您需要将其转换为字符串:
var text = items.Aggregate((x,y)=> x+", "+y);
MyItemDataType每个查询都不同,您必须自己找出正在使用的数据类型,以及MyProperty该类中表示行文本的属性。
编辑
您也可以使用此代码。它做同样的事情:
string text = "";
for (int i = 0; i < data.Items.Count; i++)
{
text += data.Items[i].ToString();
if(i < data.Items.Count - 1)
text += ", ";
}
writer.WriteLine(text);
但要注意data.Items[i].ToString(). 例如,如果每个项目都是类型,int则data.Items[i].ToString()返回一个表示该整数值的字符串(例如 1 变成“1”),但如果它们是其他类型(例如Customeror MyDataGridItem),则需要覆盖ToString()该类的方法以查看像这样:
public class Customer{
//...
public override string ToString(){
return this.Id + " " + this.Name;
}
}
因此,如果您因任何原因无法覆盖此方法,则需要采用另一种方法:
string text = "";
for (int i = 0; i < data.Items.Count; i++)
{
Customer customer = data.Items[i] as Customer;//cast is required since type of Items[i] is object
text += (customer.Id + " " + customer.Name);
if(i < data.Items.Count - 1)
text += ", ";
}
writer.WriteLine(text);
此外,您可以使用 aStringBuilder来加速字符串连接,因为+=在字符串上速度很慢。
- 3 回答
- 0 关注
- 284 浏览
添加回答
举报