我是编程的新手(大学一年级),正在研究一个小型应用程序。
我有一个窗口,用户可以在其中从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
中的数据无法正确显示?
预先感谢
答案 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.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”),但是如果它们是其他类型(例如{{ 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();
}
}
}