将DataGrid导出到文本文件

时间:2018-07-26 10:43:15

标签: c# sql wpf text-files

我是编程的新手(大学一年级),正在研究一个小型应用程序。

我有一个窗口,用户可以在其中从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中的数据无法正确显示?
预先感谢

3 个答案:

答案 0 :(得分:3)

您当前正在使用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));        
}

答案 1 :(得分:2)

这是因为data.ItemsItemCollection而不是字符串。

当要求所有对象将其内容表示为字符串时,所有对象均返回其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”),但是如果它们是其他类型(例如{{ 1}}或Customer),您需要重写该类的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); 加快字符串连接速度,因为StringBuilder在字符串上的速度很慢。

答案 2 :(得分:0)

查看示例代码here。这会做您想要的。

public static void WriteDataToFile(DataTable submittedDataTable, string submittedFilePath)
        {
            int i = 0;
            StreamWriter sw = null;

            sw = new StreamWriter(submittedFilePath, false);

            for (i = 0; i < submittedDataTable.Columns.Count - 1; i++)
            {

                sw.Write(submittedDataTable.Columns[i].ColumnName + ";");

            }
            sw.Write(submittedDataTable.Columns[i].ColumnName);
            sw.WriteLine();

            foreach (DataRow row in submittedDataTable.Rows)
            {
                object[] array = row.ItemArray;

                for (i = 0; i < array.Length - 1; i++)
                {
                    sw.Write(array[i].ToString() + ";");
                }
                sw.Write(array[i].ToString());
                sw.WriteLine();

            }

            sw.Close();
        }

另外,看看这个。

using System;
using System.Web;
using System.IO;
using System.Data;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Button1_Click(object sender, EventArgs e)
        {
            StreamWriter swExtLogFile = new StreamWriter("D:/Log/log.txt",true);
            DataTable dt = new DataTable();
           //Adding data To DataTable
            dt.Columns.Add("ID");
            dt.Columns.Add("Name");
            dt.Columns.Add("Address");
            dt.Rows.Add(1, "venki","Chennai");
            dt.Rows.Add(2, "Hanu","London");
            dt.Rows.Add(3, "john","Swiss");

            int i;
            swExtLogFile.Write(Environment.NewLine);
            foreach (DataRow row in dt.Rows)
            {  
                object[] array = row.ItemArray;
                for (i = 0; i < array.Length - 1; i++)
                {
                   swExtLogFile.Write(array[i].ToString() + " | ");
                }
                swExtLogFile.WriteLine(array[i].ToString());             
            }
            swExtLogFile.Write("*****END OF DATA****"+DateTime.Now.ToString());
            swExtLogFile.Flush();
            swExtLogFile.Close();

        }
    }
}