找回密码
 立即注册

QQ登录

只需一步,快速开始

冰岛
注册会员   /  发表于:2023-5-24 16:54  /   查看:2775  /  回复:17
1金币
本帖最后由 冰岛 于 2023-5-24 16:58 编辑

1、使用多DataTable绑定之后,再次打开文件,请问如何获取数据源?
2、下面是我使用2个DataTable绑定的代码,不知道是这个是不是最优的方式。
3、请问如何将标题行设置为不可编辑。
4、如何将多余的行和列都隐藏。(再不影响我继续添加行和列的情况下)
        private void btnSetDataTable_Click(object sender, EventArgs e)
        {
            SetDataTable();
            GrapeCity.Spreadsheet.IWorksheet TestActiveSheet = fpSpread1.AsWorkbook().ActiveSheet;
            TestActiveSheet.AutoFilterMode = false;

            GrapeCity.Spreadsheet.ITable table = TestActiveSheet.Range("A2:G7").CreateTable(true);
            table.ShowAutoFilter = false;
            table.AutoGenerateColumns = true;
            table.DataSource = dt;

            GrapeCity.Spreadsheet.ITable table2 = TestActiveSheet.Range("A2025").CreateTable(true);
            table2.AutoGenerateColumns = true;
            table2.DataSource = dt2;
        }
image.png604277953.png


最佳答案

查看完整内容

1.表格本身并不保存数据源。所以正常来说,你应该是在退出时,循环获取每个table的数据源。自己进行保存。下次再设置回来 2代码没什么问题,AutoGenerateColumns 默认应该就是true不需要特别设置,如果是要分别设置每列绑的字段的话,可以再设置为false,然后通过代码设置绑定列 3“如何将标题行设置为不可编辑”--这个没什么特殊的设置办法。和此前版本一样,你可以选择设置单元格保护,来禁止编辑。或者可以通过开始编辑等 ...

17 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-24 16:54:39
来自 2#
1.表格本身并不保存数据源。所以正常来说,你应该是在退出时,循环获取每个table的数据源。自己进行保存。下次再设置回来

2代码没什么问题,AutoGenerateColumns 默认应该就是true不需要特别设置,如果是要分别设置每列绑的字段的话,可以再设置为false,然后通过代码设置绑定列

3“如何将标题行设置为不可编辑”--这个没什么特殊的设置办法。和此前版本一样,你可以选择设置单元格保护,来禁止编辑。或者可以通过开始编辑等事件来做判断

4.可以通过WorkSheet.UsedRange拿到使用的行列区域,然后对多余的行里设置隐藏
回复 使用道具 举报
冰岛
注册会员   /  发表于:2023-5-25 10:22:11
3#
本帖最后由 冰岛 于 2023-5-25 14:34 编辑
Richard.Ma 发表于 2023-5-24 18:34
1.表格本身并不保存数据源。所以正常来说,你应该是在退出时,循环获取每个table的数据源。自己进行保存。 ...

1、再次打开保存的文件,那我如何获取fpSpread上设置的两个数据区域,并转为DataTable呢?(因为必须要获取到fpSpread上的数据,并且需要获取到对应列名称,像datatable.Rows[0][0]这样,就可以把我需要的数据提取出来保存至数据库中了。
2、我通过            fpSpread1.ActiveSheet.Rows[1].Locked = true;            TestActiveSheet.Range(nRange).Locked = true;这两种设置后,行都还是可以编辑,唯有fpSpread1.ActiveSheet.Protect = true;设置后,整表将不可编辑,但这不是我想要的,我只想要列名称行不可编辑、还有就是数据行中前5列不可编辑。
3、我如何快速方便的指定一个区域的单元格隐藏呢?如图。
4、当设置了第一个DataTable数据源之后,想设置第二个数据源,如何获取第一个数据源已使用的行呢?即“A10:G11"
我使用这种方式去创建,table2 就=NULL了,GrapeCity.Spreadsheet.ITable table2 = TestActiveSheet.Range(TestActiveSheet.UsedRange.CurrentRegion.ToString()).CreateTable(true)
5、如何将标题行第一列设置为复选框呢?并选择标题行复选框后,该组第一列都勾选?
image.png486358947.png
6、我给DataTable添加了数据行,怎么让上面的数据自动添加数据行显示呢?
我的第二个数据源用控制行的方式显示了,但第一个数据源添加的数据行怎么应该去显示呢?
private void btnAddDataRow_Click(object sender, EventArgs e)
        {
            DataRow NewRow = dt.NewRow();
            NewRow["true"] = true;
            NewRow["记录模板编号"] = "1";
            NewRow["证书模板编号"] = "1";
            NewRow["记录编号"] = "2023400007";
            NewRow["证书编号"] = "";
            NewRow["委托单位"] = "测试7";
            NewRow["证书类型"] = "校准证书";
            NewRow["证书单位"] = "测试7";
            NewRow["样品名称"] = "电子台秤";
            NewRow["规格型号"] = "001";
            NewRow["出厂编号"] = "002";
            NewRow["制造厂家"] = "中星";
            dt.Rows.Add(NewRow);

            NewRow = dt2.NewRow();
            NewRow["true"] = true;
            NewRow["记录模板编号"] = "1";
            NewRow["证书模板编号"] = "1";
            NewRow["记录编号"] = "2023400007";
            NewRow["证书编号"] = "";
            NewRow["委托单位"] = "测试7";
            NewRow["证书类型"] = "校准证书";
            NewRow["证书单位"] = "测试7";
            NewRow["样品名称"] = "电子台秤";
            NewRow["规格型号"] = "001";
            NewRow["出厂编号"] = "002";
            NewRow["制造厂家"] = "中星";
            dt2.Rows.Add(NewRow);
            fpSpread1.ActiveSheet.Rows[0, dt.Rows.Count + dt2.Rows.Count + 1].Visible = true;
        }

image.png691017760.png



回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-25 19:00:45
4#
1.如果你就是要从table对应的单元格区域拿数据,那么可以通过tb.DataBodyRange拿到数据区域,然后循环遍历

2.locked和protect本身就是配合用的。你需要把允许编辑的区域locked设置为false

3.只能指定行或者列隐藏,区域是无法隐藏的,或者说你的具体需求是怎样的呢?

4.遍历table,获取range
  1.             for(int i=0;i< fpSpread1.AsWorkbook().ActiveSheet.Tables.Count;i++)
  2.             {
  3.                 var tb = fpSpread1.AsWorkbook().ActiveSheet.Tables[i];
  4.                 tb.Range
  5.             }
复制代码


5,你可以尝试设置单元格类型,然后再cellclick事件中来判断,执行逻辑代码

6.没太明白你的意思,
回复 使用道具 举报
冰岛
注册会员   /  发表于:2023-5-26 10:16:43
5#
本帖最后由 冰岛 于 2023-5-26 13:17 编辑
Richard.Ma 发表于 2023-5-25 19:00
1.如果你就是要从table对应的单元格区域拿数据,那么可以通过tb.DataBodyRange拿到数据区域,然后循环遍历
...

版主,我上传一个DEMO,麻烦版主帮我按问题帮我编辑一下代码看如何实现需求可以吗?非常感谢。我想达到的效果就是和视频一样就可以了。(我上传一个视频)

1、通过DEMO,设置“设置多表数据源”后“保存”,然后再“打开”,再“获取数据源”时,我需要获取到保存到文件的数据(需要包含列名称),转为DataTable.
2、按扭“设置多表数据源”最后三行代码是设置行不可编辑,但没起作用。需要设置多表数据的列名称行不可编辑。以及前3列的数据不可编辑。
3、快速方便的指定一个区域的单元格隐藏是指,当我设置多表数据后,当第二个表的数据列大于第一个表的时候,列数就会增加。需要把第一个数据行增加的单元格隐藏掉不可输入数据。具体表现是:按“设置多表数据源”后,数据区右上角会多出的空白单元格需要隐藏。
4、我在设置多表数据的时候,设置第二表数据时计算TestActiveSheet.Range(nRange).CreateTable(true);中的nRange时,使用的是            
string nRange = "A" + (dt.Rows.Count + 2) + ":G" + (dt2.Columns.Count + 1);这种方式,我想有没有更好的获取前面已使用的数据区域的方式,而不是我这样硬加。在按扭“设置多表数据源”时,需要改善。
5、我设置了表第一列的单元格类型为CheckBox,但不知道怎么把列头也设置为CheckBox,列如"列A"我需要设置为复选框,并勾选后整个表格的第一列都选中。还有就是我需要当多表的时候,标题行第一列也设置为CheckBox,当选择后,将当前表的数据都选中(不是多表的数据都选中)。
6、使用按扭“设置多表数据源”后,再点击”添加数据行“按扭,我需要把添加到dt、dt2的数据,显示到对应区域。
7、如何对dt、dt2的数据分别进行排序?

WindowsFormsApp1.rar

14.3 MB, 下载次数: 418

QQ录屏20230526114811.rar

6.51 MB, 下载次数: 350

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-29 09:36:46
6#
可以,需要一些时间。预计明天给你结果
回复 使用道具 举报
冰岛
注册会员   /  发表于:2023-5-29 10:03:05
7#
Richard.Ma 发表于 2023-5-29 09:36
可以,需要一些时间。预计明天给你结果

感谢版主。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-29 11:44:54
8#
不客气
回复 使用道具 举报
冰岛
注册会员   /  发表于:2023-5-31 18:37:20
9#
Richard.Ma 发表于 2023-5-29 11:44
不客气

请问版主有消息了吗?感谢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-6-1 09:04:07
10#
早上我写好demo后发你
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部