找回密码
 立即注册

QQ登录

只需一步,快速开始

withsmile

初级会员

21

主题

50

帖子

319

积分

初级会员

积分
319

活字格认证

withsmile
初级会员   /  发表于:2013-3-4 09:01  /   查看:5813  /  回复:4
创建两个fpspread对象,并给两个对象引用DataTable, fpSPread1.DataSource = dt1,fpSpread2.DataSource = dt2,

dt1有行内容,dt2无行内容,通过按钮事件触发后台线程,

后台线程负责删除dt1的指定几行,并将删除的几行增加给dt2

不过,程序只要按照这个逻辑走,就容易导致fpSpread对象报错,显示大红叉。

请问,一个窗口内两个fpSpread对象,不能同时对它们的DataSource进行操作吗?

下面是我的代码,为方便查看已精简过。
  1. ///窗口加载
  2. void Form1_Load(object sender, EventArgs e)
  3.         {
  4.             _dtContent = new System.Data.DataTable();
  5.             _dtContent.Columns.Add("列A", typeof(string));
  6.             _dtContent.Columns.Add("列B", typeof(string));
  7.             _dtContent.Rows.Add("名称1","型号1");
  8.             _dtContent.Rows.Add("名称2","型号2");
  9.             _dtContent.Rows.Add("名称3","型号3");
  10.             _dtContent.Rows.Add("名称4","型号4");
  11.             _dtContent.Rows.Add("名称5","型号5");
  12.             _dtContent.Rows.Add("名称6","型号6");
  13.             _fpSpreadContent.DataSource = _dtContent;//fpspread对象1 DataSource
  14.             _dtHistory = new System.Data.DataTable();
  15.             _dtHistory.Columns.Add("列A", typeof(string));
  16.             _dtHistory.Columns.Add("列B", typeof(string));
  17.             _fpSpreadHistory.DataSource = _dtHistory;//fpspread对象2 DataSource
  18.         }
复制代码

  1.         ///按钮1单击
  2. private void _Button1_Click(object sender, KeyPressEventArgs e)
  3.         {
  4.             pictureBox.Visible = true
  5.             backgroundWorker.RunWorkerAsync();//异步运行后台线程
  6.         }
复制代码

  1.         ///后台线程开始
  2. private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
  3.          {  
  4.            removeAt = new List<int>();
  5.            removeAt.Add(0);
  6.            removeAt.Add(2);
  7.            removeAt.Add(4);
  8.            for (int count = 0; count < removeAt.Count; count++) {  _dtHistory.ImportRow(_dtContent.Rows[removeAt[count]]);  }//增加指定列
  9.            for (int count = 0; count < removeAt.Count; count++) {  _dtContent.Rows.RemoveAt(removeAt[count]);  } //移除指定列
  10.         }
复制代码


  1.         ///后台线程结束
  2. private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  3.         {
  4.             pictureBox.Visible = false;
  5.         }
复制代码


附报错截图

fpSpread报错.jpg (38.01 KB, 下载次数: 529)

4 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-3-4 19:01:00
沙发
withsmile 你好

Spread作为一个复杂类型的表格控件,在本身并没有提供安全的多线操作方式,所以,建议你使用同步的方式来操作两个Spread对象,不要使用多线程进行操作。
回复 使用道具 举报
withsmile
初级会员   /  发表于:2013-3-5 07:47:00
板凳
好的,谢谢版主!
回复 使用道具 举报
withsmile
初级会员   /  发表于:2013-3-5 07:53:00
地板
重复发帖了...
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-3-6 12:25:00
5#
哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部