C#:txt内容显示到dataGridView程序假死问题:

TXT内容如下:baidu----123456----百度帐号hao123----123456----hao123帐号duowan----123456----多玩帐号要求... TXT内容如下:
baidu----123456----百度帐号
hao123----123456----hao123帐号
duowan----123456----多玩帐号

要求显示在dataGridView效果如下表格

帐号 密码 备注
baidu 123456 baidu帐号
hao123 123456 hao123帐号
duowan 123456 多玩帐号

以下代码在数据少时可以的,但数据大(如10000条记录)时程序就假死了,如何解决假死问题啊?
private void button1_Click(object sender, EventArgs e)
{
//建立一个打开文件的对话框
using (OpenFileDialog dlgText = new OpenFileDialog())
{
dlgText.Filter = "文本文件|*.txt";
if (dlgText.ShowDialog() == DialogResult.OK)
{
//新建一个datatable用于保存读入的数据
DataTable dt = new DataTable();
//给datatable添加三个列
dt.Columns.Add("帐号", typeof(String));
dt.Columns.Add("密码", typeof(String));
dt.Columns.Add("备注", typeof(String));
//读入文件
using (StreamReader reader = new StreamReader(dlgText.FileName, Encoding.Default))
{
//循环读取所有行
while (!reader.EndOfStream)
{
//将每行数据,用-分割成3段
string[] data = reader.ReadLine().Replace("----", "-").Split('-');
//新建一行,并将读出的数据分段,分别存入3个对应的列中
DataRow dr = dt.NewRow();
dr[0] = data[0];
dr[1] = data[1];
dr[2] = data[2];
//将这行数据加入到datatable中
dt.Rows.Add(dr);
}
}
//将datatable绑定到datagridview上显示结果
this.dataGridView1.DataSource = dt;
}
}
}
展开
 我来答
whm412
推荐于2017-10-06 · TA获得超过515个赞
知道小有建树答主
回答量:289
采纳率:66%
帮助的人:281万
展开全部
采用多线程实现吧。
首先说一下,如果使用his.dataGridView1.DataSource = dt;这样的赋值方式,即使多线程时,在赋值也会有白屏现象。
在我的机器上面测试51万的数据,装载文件需要6秒,his.dataGridView1.DataSource = dt;这个赋值语句需要3秒。

可使用his.dataGridView1.Rows.AddRange()方法。
具体的代码见下面:
private void button1_Click(object sender, EventArgs e)
{
string filePath = GetOpenFilePath();
Thread thread = new Thread(new ParameterizedThreadStart(SetDataGridViewDataSource));
thread.Start(filePath);
}
private string GetOpenFilePath()
{
string filePaht = string.Empty;
using (OpenFileDialog dlgText = new OpenFileDialog())
{
dlgText.Filter = "文本文件|*.txt";
if (dlgText.ShowDialog() == DialogResult.OK)
{
filePaht = dlgText.FileName;
}
}
return filePaht;
}

private void SetDataGridViewDataSource(object filePath)
{
System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();

st.Start(); //开始计时

//新建一个datatable用于保存读入的数据
DataTable dt = new DataTable();
//给datatable添加三个列
dt.Columns.Add("帐号", typeof(String));
dt.Columns.Add("密码", typeof(String));
dt.Columns.Add("备注", typeof(String));
//读入文件
using (StreamReader reader = new StreamReader(filePath.ToString(), Encoding.Default))
{
//循环读取所有行
while (!reader.EndOfStream)
{
//将每行数据,用-分割成3段
string[] data = reader.ReadLine().Replace("----", "-").Split('-');
//新建一行,并将读出的数据分段,分别存入3个对应的列中
DataRow dr = dt.NewRow();
dr[0] = data[0];
dr[1] = data[1];
dr[2] = data[2];
//将这行数据加入到datatable中
dt.Rows.Add(dr);
}
}
st.Stop();
Console.WriteLine("第一次计时:" + st.ElapsedMilliseconds);

st.Reset();
st.Start();
//将datatable绑定到datagridview上显示结果
this.Invoke(new MethodInvoker(delegate() { this.dataGridView1.DataSource = dt; }));
//在此处可将数据进行分批赋值,一次赋值1000条
//this.dataGridView1.Rows.AddRange();
st.Stop();
Console.WriteLine("第二次计时:" + st.ElapsedMilliseconds);
}
心重的0P
2013-02-25 · TA获得超过131个赞
知道答主
回答量:127
采纳率:0%
帮助的人:67.1万
展开全部
你一次显示一万条以上的数据啊,不符合实际要求,dataGridView翻页,txt也不要一次性读入,每次记录读取位置,只读取需要的,对性能有要求还可以使用缓存,一个文本文件太大的话对内存要求也很高的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Octavianus_PL
2013-02-25 · TA获得超过388个赞
知道小有建树答主
回答量:168
采纳率:0%
帮助的人:174万
展开全部
楼主,从你贴的代码上看来,并没有什么明显问题。如果数据量大造成假死的话,你可以弄个进度条的效果解决呀。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lnlllnnhf
2013-02-25 · TA获得超过249个赞
知道小有建树答主
回答量:203
采纳率:0%
帮助的人:195万
展开全部
解决假死要开一个线程来 读入文件 在读取数据线程里要使用委托 这样才能让UI(界面线程显示)
这样UI线程压力就小了,不会假死了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蚂蚁棚
2013-02-25 · TA获得超过138个赞
知道答主
回答量:200
采纳率:0%
帮助的人:130万
展开全部
弄个翻页,分页显示内容吧。估计内容太多造成的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式