3 回答

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));
}

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 關注
- 319 瀏覽
添加回答
舉報