在修改将GridView中的数据导出到Excel表中的时候,出现了很多问题在这里将主要的几个问题及解决方案罗列出来,仅供参考
1.首先出现的是跨线程的错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
解决方法:创建(new)一个新线程即作为子线程,让子线程去做发生错误的这一段代码,主线程即UI线程去执行别的,但在执行过程中子线程不能阻碍主线程的执行且还需要主线程传参数到子线程去执行代码,因为主线程传参使用的是Thread InvokeThread = new Thread(new ParameterizedThreadStart(this.InvokeMethod)); ParameterizedThreadStart只能传递object类型的参数,而我需要的传递GridView类型的参数,需要强制转换,并且再强制转换回来。。。后来想起可以用Lambda表达式来解决问题,lambda表达式最后编译结果和强转差不多。
只需要将所有代码贴到子线程里再传个参数,注意:因为最后要将子线程关闭所以创建新线程时要是全局变量,最后bia上代码:
public Thread InvokeThread { get; private set; }//定义全局线程属性,方便最后关闭
this.InvokeThread = new Thread(() => InvokeMethod(dgv));
//Thread InvokeThread = new Thread(new ParameterizedThreadStart(this.InvokeMethod));
//1.用强制类型转换,ParameterizedThreadStart只能用object类型的需要强制转换 强制转换两次。。。
//设置客户端通信线程同步,才能打开接收文件对话窗口
InvokeThread.SetApartmentState(ApartmentState.STA);
InvokeThread.IsBackground = true;
InvokeThread.Start();
public void InvokeMethod(GridView mydgv)
{要执行的的代码}
2.在获取GridView当中的数据并遍历出来时选要注意选取适当的gridview.row当要获取Column中的数据,可能获取不到count数,此时要利用两个for循环 for (int i = 0; i < dgv.Rows.Count; i++) ; for (int j = 0; j < dgv.Rows[0].Cells.Count; j++)来遍历出表格中的数据,再执行别的功能,在获取行column中的text文本数据时一直都读取不到行中的数,百思不得其解,最终在一广大网友处得到借鉴。
rotected void Button1_Click(object sender, EventArgs e)
{
DataTable dt = SqlHelper.ExecuteDataTable(CommandType.Text, "select * from S_Admin");
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void Button2_Click(object sender, EventArgs e)
{
for (int k = 0; k < GridView1.HeaderRow.Cells.Count; k++)
{
string HeaderText = GridView1.HeaderRow.Cells[k].Text;
Response.Write(HeaderText + "");
}
}
我的解决方式: for (int i = 0; i < dgv.HeaderRow.Cells.Count; i++)
{
excel.Cells[1, i + 1] = dgv.HeaderRow.Cells[i].Text.ToString();
}
for (int i = 0; i < dgv.Rows.Count; i++)
{
//j也是从1开始 原因如上 每个人需求不一样
for (int j = 0; j < dgv.Rows[0].Cells.Count; j++)
{
string str = dgv.Rows[i].Cells[j].Text;
if (string.IsNullOrEmpty(str))
{
str = "null";//null
}
if (str.GetType() == typeof(string))
{
string s = str.Trim();
excel.Cells[i + 2, j + 1] = "'" + s;
continue;
}
else
{
excel.Cells[i + 2, j + 1] = str;
}
}
}
最后感谢网友帮助
1.跨线程问题https://blog.csdn.net/zzq900503/article/details/13294355
2.线程传值问题https://www.cnblogs.com/zeroone/archive/2013/09/04/3300274.html