【问题标题】:Export DataGrid to text file将 DataGrid 导出到文本文件
【发布时间】:2018-07-26 10:43:14
【问题描述】:

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

我有一个窗口,用户可以在其中将数据从 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 中的数据没有以正确的方式显示?
提前致谢

【问题讨论】:

  • 您当前正在编写data.Items 对象的默认ToString 实现,如果是System.Windows.Controls.ItemCollection,如果您想打印每个项目,那么您需要遍历每个项目,然后打印所需值
  • 为了在文件中存储早午餐数据,我建议将它们序列化为 Xml 或 Json。这样您的数据将被正确转义并且保存检索信息将很容易。

标签: c# sql wpf text-files


【解决方案1】:

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

【讨论】:

    【解决方案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”)但如果它们是其他类型(例如Customer 或@987654335 @) 你需要重写该类的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 来加速字符串连接,因为+= 处理字符串速度很慢。

    【讨论】:

    • 请大家举一个实际的例子。因为正如我所说,我是这个领域的新手,而且我一开始就不懂复杂的代码。再次感谢
    • Mong Zhu 的回答解释了理论,我尝试使用一个实际示例进行详细说明,您可以将其复制/粘贴到您的代码中。您可以详细了解我使用 keywork Linq 发布的这些查询。不过,我也尝试发布一些更简单的示例。
    • 我还有一个问题。使用上面的代码如何编写特定的列
    • 最后一段代码中的@portal,可以将text += (customer.Id + " " + customer.Name);替换为text += (customer.YourSpecificColumn);。或者您可以将前三个示例中的MyProperty 替换为您的特定列。
    【解决方案3】:

    查看示例代码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();
    
            }
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2020-09-05
    • 2019-02-26
    相关资源
    最近更新 更多