找回密码
 立即注册

QQ登录

只需一步,快速开始

dapsjj
初级会员   /  发表于:2016-11-30 09:45  /   查看:3777  /  回复:7
本帖最后由 dapsjj 于 2016-11-30 10:43 编辑

spread显示的内容是循环dataset放进去的,放进spread后,spread使用grdMain.ActiveSheet.DataSource = m_rsDirect;去绑定数据源,然后修改了spread中的一些值,点击一个按钮,去调试spread的值发生变化后,dataset的对应值有没有发生变化,结果发现dataset的对应的值没有发生改变,调试的代码为:
  1.   private void displayData()
  2.         {
  3.              m_rsDirect = GetThroughDirectionDataForCorrectDirection(m_intBin, m_strProdCode);//执行存储过程获取结果集
  4.             if (m_rsDirect == null)
  5.             {
  6.                 grdMain.ActiveSheet.ClearRange(0, 0, grdMain.ActiveSheet.RowCount, grdMain.ActiveSheet.ColumnCount, false);
  7.                 grdMain.ActiveSheet.Cells[0, 0, grdMain.ActiveSheet.RowCount - 1, grdMain.ActiveSheet.ColumnCount - 1].Locked = true;
  8.                 MessageBox.Show("无数据!");

  9.             }
  10.             else
  11.             {
  12.                 grdMain.ActiveSheet.DataSource = m_rsDirect;//grdMain绑定数据源
  13.                 setGrdMainSpreadData(m_rsDirect.Tables[0]);//数据放入spread
  14.             }
  15.         }
  16.                
  17.                  private void setGrdMainSpreadData(DataTable spdt)
  18.         {
  19.             if (this.grdMain.ActiveSheet.RowCount > 0)
  20.             {
  21.                 this.grdMain.ActiveSheet.Rows.Count = 0;
  22.             }
  23.             this.grdMain.ActiveSheet.Rows.Count = spdt.Rows.Count;


  24.             DataRowCollection rows = spdt.Rows;
  25.             int rowCount = rows.Count;
  26.             int nowRow = 0;
  27.             for (int i = 0; i < rowCount; i++)
  28.             {
  29.                 grdMain.ActiveSheet.Cells[nowRow, 0].Value = rows[i]["店CD"].ToString();
  30.                 grdMain.ActiveSheet.Cells[nowRow, 1].Value = rows[i]["店名称"].ToString();
  31.                 grdMain.ActiveSheet.Cells[nowRow, 2].Value = rows[i]["No"].ToString();
  32.                 grdMain.ActiveSheet.Cells[nowRow, 3].Value = rows[i]["数量"].ToString();
  33.                 grdMain.ActiveSheet.Cells[nowRow, 4].Value = rows[i]["重量"].ToString();

  34.                 nowRow++;
  35.             }

  36.         }
  37.                 private void btnDecide_Click(object sender, EventArgs e)
  38.                 //到这个方法调试数据的时候发现spread的值改变后,dataset的对应的值无变化
  39.         {
  40.       
  41.             foreach (DataRow row in m_rsDirect.Tables[0].Rows)
  42.             {
  43.                 foreach (DataColumn mDc in m_rsDirect.Tables[0].Columns)
  44.                 {
  45.                         string a = row[mDc].ToString();
  46.                 }   
  47.             }
  48.         }   
  49.                
复制代码

请问为啥datdset的值没有随着spread的变化而变化呢?


7 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-11-30 19:19:09
沙发
您好 您使用了绑定就不需要重新这是row count 了,您下面的操作等于删除掉了所有绑定的行


            if (this.fpSpread1.ActiveSheet.RowCount > 0)
            {
                this.fpSpread1.ActiveSheet.Rows.Count = 0;
            }
            this.fpSpread1.ActiveSheet.Rows.Count = spdt.Rows.Count;
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-11-30 19:58:37
板凳
本帖最后由 dapsjj 于 2016-12-1 08:42 编辑
dexteryao 发表于 2016-11-30 19:19
您好 您使用了绑定就不需要重新这是row count 了,您下面的操作等于删除掉了所有绑定的行

您好,删除这3行代码就行吗?
if (this.grdMain.ActiveSheet.RowCount > 0)
{
this.grdMain.ActiveSheet.Rows.Count = 0;
}
this.grdMain.ActiveSheet.Rows.Count = spdt.Rows.Count;
我删了这3行了,但是点击按钮调用btnDecide_Click()方法时,string a 调试的时候还是没有绑定到数据源,值还是空。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-12-1 08:58:05
地板
我这里测试是好着的,有个问题是您既然绑定了datasource为何还要再次给单元格赋值。

如果你想指定绑定列的内容可以使用下面代码
//不根据dt自动生成列
            fpSpread1.ActiveSheet.AutoGenerateColumns = false;
            //设置第一列绑定ds中列名
            fpSpread1.ActiveSheet.Columns[0].DataField = "Number1";
            fpSpread1.ActiveSheet.Columns[1].DataField = "Number2";
            fpSpread1.ActiveSheet.Columns[2].DataField = "Number3";
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-12-1 09:01:19
5#
本帖最后由 dapsjj 于 2016-12-1 09:16 编辑
dexteryao 发表于 2016-12-1 08:58
我这里测试是好着的,有个问题是您既然绑定了datasource为何还要再次给单元格赋值。

如果你想指定绑定列 ...

您好,绑定dataset后不用给spread赋值吗?那怎么知道spread的哪一列绑定的是dataset中的哪一列呢?是自动根据spread的从第一列开始赋dataset的第一例的值吗?spread的从第2列开始赋dataset的第2例的值这样以此类推吗?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-12-1 17:54:11
6#
不用赋值,会自动赋值的。

如果AutoGenerateColumns =ture 那么就会按照datatable的 列自动生成spread中的列,然后填充数据。
如果 设置   fpSpread1.ActiveSheet.AutoGenerateColumns = false;
可以通过设置DataField 来指定spread的列具体对应datatable中的那一列

            fpSpread1.ActiveSheet.Columns[0].DataField = "Number1";
回复 使用道具 举报
dapsjj
初级会员   /  发表于:2016-12-2 08:01:47
7#
本帖最后由 dapsjj 于 2016-12-2 08:04 编辑
dexteryao 发表于 2016-12-1 17:54
不用赋值,会自动赋值的。

如果AutoGenerateColumns =ture 那么就会按照datatable的 列自动生成spread中 ...

我使用的是这行代码绑定数据源grdMain.ActiveSheet.DataSource = m_rsDirect;//m_rsDirect是dataset类型
其中m_rsDirect是dataset类型是dataset类型,也能成功,这个m_rsDirect是dataset类型没问题吧?另外我看代码里也没有写 ActiveSheet.AutoGenerateColumns = false;也自动的赋值了,那么默认不写的话也是自动赋值吗?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-12-2 08:54:15
8#
对,AutoGenerateColumns 的默认值是false。
DataSource 可以是dataset 也可以直接是datatable。。
如果是dataset默认取第一个DataTable的内容
如果制定了fpSpread1.DataMember = "Table2"; 那就就获取 这个Table的内容。

评分

参与人数 1满意度 +5 收起 理由
dapsjj + 5 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部