找回密码
 立即注册

QQ登录

只需一步,快速开始

victorysoft

高级会员

40

主题

100

帖子

1040

积分

高级会员

积分
1040

活字格认证

victorysoft
高级会员   /  发表于:2013-8-28 22:24  /   查看:9717  /  回复:11
你好
        (spread6.0  winform ) 邦定数据源后且进行了分组,怎样在数据源(DataTable)根据查询条件变更后,显示的数据也发生变化. 调试了一下午没找到方法.急用.

      this.fpSpread1_Sheet1.DataSource = datatable;
      .....

      private void SettingForDefaultGroupFooter()
{
                GroupDataModel gdm = new GroupDataModel(this.fpSpread1_Sheet1.Models.Data);
                SortInfo[] siList = new SortInfo[] { new SortInfo(1, true) };
                gdm.Group(siList);
                this.fpSpread1_Sheet1.Models.Data = gdm;
}

QQ截图20130828222401.png

11 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-8-29 10:06:00
沙发
回复 1楼victorysoft的帖子

你好,
感谢问题反馈。
我使用以下测试代码可以正常更新分组数据:

  1. public partial class Form1 : Form
  2.     {
  3.         public Form1()
  4.         {
  5.             InitializeComponent();
  6.             InitSpread();
  7.         }

  8.         DataTable DT = new DataTable();
  9.         private void InitSpread()
  10.         {
  11.             DT.Columns.Add("test1");
  12.             DT.Columns.Add("test2");

  13.             DT.Rows.Add("小米", "1000");
  14.             DT.Rows.Add("小米", "1000");
  15.             DT.Rows.Add("酷派", "800");
  16.             DT.Rows.Add("中兴", "900");

  17.             this.fpSpread1.Sheets[0].DataSource = DT;
  18.         }

  19.         private void 分组ToolStripMenuItem_Click(object sender, EventArgs e)
  20.         {
  21.             GroupDataModel gdm = new GroupDataModel(this.fpSpread1_Sheet1.Models.Data);
  22.             SortInfo[] siList = new SortInfo[] { new SortInfo(0, true) };
  23.             gdm.Group(siList);
  24.             this.fpSpread1_Sheet1.Models.Data = gdm;
  25.         }

  26.         private void 改变数据源ToolStripMenuItem_Click(object sender, EventArgs e)
  27.         {
  28.             DT.Rows.Add("中兴", "900");
  29.         }
  30.     }
复制代码

请参考,如果没有解决问题,请发测试 Demo 到论坛调试。
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2013-8-29 10:34:00
板凳
刚才测试了一下,我明白了,每次查询我都是重新绑定数据源,这种方法行不通,或许是我的用法不对, 但对spread一次性绑定数据源后,去调整这个数据源的记录这个方法可以.
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-29 10:46:00
地板
回复 3楼victorysoft的帖子

恩,重新绑定肯定是可以的。
如果需要,可以发送 Demo 到论坛我协助调试。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-29 10:47:00
5#
回复 0楼iceman的帖子

邀请身为大侠、资深用户的你参加活动:
目前我们正在举办案例大赛活动。

只需要一些项目的描述性文字和几个截图。
不但可以展示您的使用技巧,使更多的用户受益。
还有机会获得 3000 千元奖金。

真诚的邀请您参加:http://www.gcpowertools.com.cn/event/casecompetition.htm
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2013-8-29 12:42:00
6#

Demo

数据源绑定和分组问题Demo.rar (56.5 KB, 下载次数: 177)
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2013-8-29 14:38:00
7#
中午我又测试了一下,发现如果绑定的数据源被重新实例化,重新绑定给Spread时,Spread数据与新数据源的数据会不一致,仍然保持第一次绑定时的数据.
如果不执行分组代码的话,没问题.
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-29 15:15:00
8#
回复 7楼victorysoft的帖子

关于 form1 的问题需要在设置数据源之前重置 表单,修改后如下:

  1. namespace 数据源绑定和分组问题Demo
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         DataTable dt = new DataTable();

  6.         public Form1()
  7.         {
  8.             InitializeComponent();
  9.         }

  10.         private void Form1_Load(object sender, EventArgs e)
  11.         {
  12.             dt.Columns.Add("名称");
  13.             dt.Columns.Add("价格");

  14.             dt.Rows.Add("小米", "1000");
  15.             dt.Rows.Add("小米", "1000");
  16.             dt.Rows.Add("酷派", "800");
  17.             dt.Rows.Add("中兴", "900");

  18.             //设置邦定从第二列开始(第一列预留)
  19.             this.fpSpread1_Sheet1.BindDataColumn(1, "名称");
  20.             this.fpSpread1_Sheet1.BindDataColumn(2, "价格");

  21.             this.fpSpread1_Sheet1.AutoGenerateColumns = false;

  22.             QueryData();
  23.             SettingForDefaultGroupFooter();
  24.         }

  25.         private void QueryData()
  26.         {
  27.             #region 模拟创建新的数据源
  28.             DataTable dt1 = new DataTable();
  29.             dt1 = dt.Clone();
  30.             DataRow[] drs = null;

  31.             if (this.textBox1.Text != "")
  32.             {
  33.                 drs = dt.Select("名称 like '%" + this.textBox1.Text + "%'");
  34.             }
  35.             else
  36.             {
  37.                 drs = dt.Select();
  38.             }

  39.             foreach (DataRow dr in drs)
  40.             {
  41.                 dt1.Rows.Add(dr.ItemArray);
  42.             }
  43.             #endregion

  44.             //绑定数据源
  45.             this.fpSpread1.Sheets[0].Reset();
  46.             this.fpSpread1.Sheets[0].DataSource = dt1;
  47.             SettingForDefaultGroupFooter();
  48.         }


  49.         //设置分组
  50.         private void SettingForDefaultGroupFooter()
  51.         {
  52.             GroupDataModel gdm = new GroupDataModel(this.fpSpread1_Sheet1.Models.Data);
  53.             SortInfo[] siList = new SortInfo[] { new SortInfo(1, true) };
  54.             gdm.Group(siList);
  55.             this.fpSpread1_Sheet1.Models.Data = gdm;
  56.         }

  57.         private void button1_Click(object sender, EventArgs e)
  58.         {
  59.             QueryData();
  60.         }
  61.     }
  62. }
复制代码
回复 使用道具 举报
victorysoft
高级会员   /  发表于:2013-8-29 15:40:00
9#
this.fpSpread1.Sheets[0].Reset();  这个方法有些太强大了,会把所有的Spread设置包括样式 都重置了
难道没有其它方法了吗?

尝试重新绑定完成后,再次执行分组方法,会在 sv1.Models.Data = gdm; 处报一个错误"Does not support the IGroupSupport object as the target of the new data model."
SheetView sv1 = this.fpSpread1_Sheet1;
            GroupDataModel gdm = new GroupDataModel(sv1.Models.Data);
            SortInfo[] siList = new SortInfo[] { new SortInfo(1, true) };
            try
            {
                gdm.Group(siList);
                sv1.Models.Data = gdm;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-8-29 18:41:00
10#
回复 9楼victorysoft的帖子

你好,

不好意思,久等了。
问题我这边已经重现了。目前需要做的是重置 Sheet 的 Data 模型。从而移除分组。

现在给出一种解决方法:

  1. private void QueryData()
  2.         {

  3.             #region 模拟创建新的数据源

  4.             try
  5.             {
  6.                 fpSpread1.Sheets[0].Models.Data = ((FarPoint.Win.Spread.Model.GroupDataModel)fpSpread1.Sheets[0].Models.Data).TargetModel;
  7.             }
  8.             catch (Exception) { }

  9.             DataTable dt1 = new DataTable();
  10.             dt1 = dt.Clone();
  11.             DataRow[] drs = null;

  12.             if (this.textBox1.Text != "")
  13.             {
  14.                 drs = dt.Select("名称 like '%" + this.textBox1.Text + "%'");
  15.             }
  16.             else
  17.             {
  18.                 drs = dt.Select();
  19.             }

  20.             foreach (DataRow dr in drs)
  21.             {
  22.                 dt1.Rows.Add(dr.ItemArray);
  23.             }
  24.             #endregion

  25.             //绑定数据源

  26.             this.fpSpread1.Sheets[0].DataSource = dt1;
  27.             SettingForDefaultGroupFooter();
  28.         }
复制代码


这种方法通过强制转换来重置数据模型。并不完美,我会继续查找是否有其他解决办法。
并及时通知。
谢谢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部