猿问

将 DataGrid 导出到文本文件

我是编程新手(在大学学习的第一年),我正在开发一个小型应用程序。


我有一个窗口,用户可以在其中从 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 + "              ");

    }

}

当我打开文本文件时,我得到了这些数据


Welcome

E N T E R N E T

System.Windows.Controls.ItemCollection -   Why isn't show the data grid 

data


---------------------------------------

    Thank You   

    7/26/2018 12:38:37 PM   

我的问题是:我的错误在哪里导致数据DataGrid无法以正确的方式显示?


慕码人8056858
浏览 285回答 3
3回答

森林海

您当前正在使用该WriteLine方法的以下重载:public virtual void WriteLine(object value)如果您查看StreamWriter.WriteLine(object)的文档,它会说:通过调用对象上的ToString方法写入对象的文本表示,后跟行终止符到文本字符串或流。这就是您在文件中得到以下漂亮行的原因:System.Windows.Controls.ItemCollectionObject.ToString()方法的文档显示Object.ToString 方法的默认实现返回对象类型的完全限定名称。您需要遍历集合并将每个条目分别写入文件。我还建议直接使用数据源,而不是从DataGrid.foreach (DataRow row in dt.Rows){      object[] array = row.ItemArray;    writer.WriteLine(string.Join(" | ", array));        }

侃侃无极

这是因为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++){&nbsp; &nbsp; text += data.Items[i].ToString();&nbsp; &nbsp; if(i < data.Items.Count - 1)&nbsp; &nbsp; &nbsp; &nbsp; text += ", ";}writer.WriteLine(text);但要注意data.Items[i].ToString(). 例如,如果每个项目都是类型,int则data.Items[i].ToString()返回一个表示该整数值的字符串(例如 1 变成“1”),但如果它们是其他类型(例如Customeror MyDataGridItem),则需要覆盖ToString()该类的方法以查看像这样:public class Customer{&nbsp; &nbsp; //...&nbsp; &nbsp; public override string ToString(){&nbsp; &nbsp; &nbsp; &nbsp; return this.Id + " " + this.Name;&nbsp; &nbsp; }}因此,如果您因任何原因无法覆盖此方法,则需要采用另一种方法:string text = "";for (int i = 0; i < data.Items.Count; i++){&nbsp; &nbsp; Customer customer = data.Items[i] as Customer;//cast is required since type of Items[i] is object&nbsp; &nbsp; text += (customer.Id + " " + customer.Name);&nbsp; &nbsp; if(i < data.Items.Count - 1)&nbsp; &nbsp; &nbsp; &nbsp; text += ", ";}writer.WriteLine(text);此外,您可以使用 aStringBuilder来加速字符串连接,因为+=在字符串上速度很慢。
随时随地看视频慕课网APP
我要回答