为了账号安全,请及时绑定邮箱和手机立即绑定

将 DataGrid 导出到文本文件

将 DataGrid 导出到文本文件

C#
慕码人8056858 2021-10-31 19:14:33
我是编程新手(在大学学习的第一年),我正在开发一个小型应用程序。我有一个窗口,用户可以在其中从 SQL 检索数据,DataGrid以及Button将一些数据从DataGrid数据导出到文本文件。这是我用来从 SQL 获取数据的代码:SqlConnection con = new SqlConnection("Server = localhost;Database = autoser; Integrated Security = true");SqlCommand cmd = new SqlCommand("selectproduct", con); // Using a Store Procedure.cmd.CommandType = CommandType.StoredProcedure;DataTable dt = new DataTable("dtList");cmd.Parameters.AddWithValue("@Code", txtbarcode.Text);SqlDataAdapter da = new SqlDataAdapter(cmd);da.Fill(dt);data.ItemsSource = dt.DefaultView;SqlDataAdapter adapt = new SqlDataAdapter(cmd);DataSet ds = new DataSet();adapt.Fill(ds);con.Close();int count = ds.Tables[0].Rows.Count;if (count == 0){    MessageBox.Show("This product doesn't excist");    SystemSounds.Hand.Play();}else if (count == 1){    lblinfo.Visibility = Visibility.Visible;    SystemSounds.Asterisk.Play();}这是我用来编写文本文件的代码:{    using (StreamWriter writer = new StreamWriter("D:\\test.txt", true))    {        writer.WriteLine("Welcome");        writer.WriteLine("E N T E R N E T");    }    using (StreamWriter writer = new StreamWriter("D:\\test.txt", true))    {        writer.WriteLine(data.Items);    }    using (StreamWriter writer = new StreamWriter("D:\\test.txt", true))    {        writer.WriteLine(data.Items);    }    // Append line to the file.    using (StreamWriter writer = new StreamWriter("D:\\test.txt", true))    {        writer.WriteLine("---------------------------------------");        writer.WriteLine("             Thank You!   ");        writer.WriteLine("        " + DateTime.Now + "              ");    }}当我打开文本文件时,我得到了这些数据WelcomeE N T E R N E TSystem.Windows.Controls.ItemCollection -   Why isn't show the data grid data---------------------------------------    Thank You       7/26/2018 12:38:37 PM   我的问题是:我的错误在哪里导致数据DataGrid无法以正确的方式显示?
查看完整描述

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

}


查看完整回答
反对 回复 2021-10-31
?
侃侃无极

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来加速字符串连接,因为+=在字符串上速度很慢。


查看完整回答
反对 回复 2021-10-31
  • 3 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信