C#多线程,关于BackgroundWorker的问题,求高手解决

zhengaoly 2011-12-04 10:26:48
class InputFromExcelSheet
{


/// <summary>
/// 根据Excel获取单张sheet的数据到datatable;
/// </summary>
/// <param name=""></param>
/// <returns></returns>


public DataTable ExcelFromSheet(int i,string filename)
{
DataTable dt = new DataTable();
Workbook xls = new Workbook(filename);//第三方插件 aspose.cells;

Worksheet sheet = xls.Worksheets[i];

int firstRow = 1, firstColumn = 0, totalRows = 0, totalColumns = 0;
totalRows = sheet.Cells.Rows.Count-1;
totalColumns = sheet.Cells.MaxColumn + 1;

if (totalRows==0)
{
string str = string.Format("所选Excel文件的第{0}张Sheet为空表单,请填写数据

后再导入!!!", i);
MessageBox.Show(str);
return null;
}
else
{
dt = sheet.Cells.ExportDataTableAsString(firstRow, firstColumn, totalRows,

totalColumns);//要以字符串的格式导入到datatable中去;否则按第一行的格式导入
return dt;

}

}


}



class ExcelHelper
{


public DataSet ds_Excel;//Excel的12张sheet的数据导入到内存dataset

public InputFromExcelSheet ipfe;//定义一个对象用来获取不同sheet中的数据到ds_excel数

据集;

OpenFileDialog ofd = new OpenFileDialog();



/// <summary>
/// 获取Excel中12张sheet的内容到ds_excel中;
/// </summary>
/// <param name=""></param>
/// <returns>是否获取数据成功;</returns>
///
public bool GetExcelData()
{

ofd.InitialDirectory = Application.ExecutablePath;
ofd.Filter = "Excel2003格式(*.xls)|*.xls|Excel2007格式(*.xlsx)|*.xlsx";
ofd.FilterIndex = 1;
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK)
{


Workbook xls = new Workbook(ofd.FileName);//第三方插件

if (xls.Worksheets.Count == 12)
{
using (BackgroundWorker worker = new BackgroundWorker())
{
ProgressLoading state = new ProgressLoading();//ProgressLoading 是

进度条
state.Show();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;



//添加事件
worker.DoWork += new DoWorkEventHandler(worker_DoWork_DaoRu);
worker.ProgressChanged += new ProgressChangedEventHandler

(state.ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler

(state.RunWorkerCompleted);
worker.RunWorkerAsync();

}


return true;
}
else
{
MessageBox.Show("所选Excel文件的不是12张sheet,请重新选择正确的导入文件

;", "注意", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return false;
}

}
else
return false;





}


void worker_DoWork_DaoRu(object sender, DoWorkEventArgs e)
{

using (BackgroundWorker worker = sender as BackgroundWorker)
{

for (int i = 0; i < 12;i++ )
{
AddDataTable(i);
string currentstate = "正在导入第" +(i+1).ToString()+ "张表";
worker.ReportProgress(i, currentstate);
// Thread.Sleep(0);
}

}



// throw new Exception("The method or operation is not implemented.");
}

private void AddDataTable(int i)
{

DataTable dt;
dt = ipfe.ExcelFromSheet(i, ofd.FileName);
if (dt != null)
{
ds_Excel.Tables.Add(dt.Copy());
}
else
MessageBox.Show("有空表!!");

}
}



public partial class Excel : Form
{

ExcelHelper eh = new ExcelHelper();

private void btnRead_Click(object sender, EventArgs e)
{
eh.GetExcelData();

int a = eh.ExcelDataSet.Tables.Count;
if (eh.ExcelDataSet.Tables.Count > 0)
{
dataGridViewRead1.DataSource = eh.ExcelDataSet.Tables[0];
dataGridViewRead2.DataSource = eh.ds_Excel.Tables[1];
dataGridViewRead3.DataSource = eh.ds_Excel.Tables[2];
dataGridViewRead4.DataSource = eh.ds_Excel.Tables[3];
dataGridViewRead5.DataSource = eh.ds_Excel.Tables[4];
dataGridViewRead6.DataSource = eh.ds_Excel.Tables[5];
dataGridViewRead7.DataSource = eh.ds_Excel.Tables[6];
dataGridViewRead8.DataSource = eh.ds_Excel.Tables[7];
dataGridViewRead9.DataSource = eh.ds_Excel.Tables[8];
dataGridViewRead10.DataSource = eh.ds_Excel.Tables[9];
dataGridViewRead11.DataSource = eh.ds_Excel.Tables[10];
dataGridViewRead12.DataSource = eh.ds_Excel.Tables[11];

}





}
}




第一个类是用来从Excel中获取一张Sheet的数据;
第二个类是从一个含有12张Sheet的Excel文件取数据,然后放到该类的DataSet 变量ds_Excel中;
第三个类是创建以个ExcelHelper 对象,然后取ds_Excel的数据在dataGridView显示;



我的问题是,在第二个类中加入了BackgroundWorker后,第三个类就获取不到ds_Excel的数据,或者说

,在第二个类的Dowork的实现函数中加入sleep(200)后,就没有数据了,请问高手如何解决???
...全文
148 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengaoly 2011-12-04
  • 打赏
  • 举报
回复
没有人遇到过么??
zhengaoly 2011-12-04
  • 打赏
  • 举报
回复
有人能解决么??

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧