找回密码
 立即注册

QQ登录

只需一步,快速开始

yin_tb

中级会员

53

主题

198

帖子

999

积分

中级会员

积分
999

微信认证勋章

yin_tb
中级会员   /  发表于:2021-5-17 18:57  /   查看:4828  /  回复:16
1金币
如题,马工,原来请教过你这个问题,我以前的问题贴子里有,你也回复了我解决办法,即:加了一个标识isentered = True。具体不说了。我在我的程序里,底层封装了TrueDBgrid,加了很多功能,一直以来,回车换行我没来得急弄,今天改底层,把最后一个单元格时回车换行加上,我发现你给我的解决办法只能完成正常状态的情况,意思如下:

如果网格里有 citem_no,citem_name,nqty,nprice,namount,cmemo这些列,
1、都显示,可以,那么用 //但是,运行时也不能拖动列调位置
if (col==tgrid1.Columns.Count-1) //当前是最后一列
{
if (row==tgrid1.VisbleRows-1 //最后一行,必须用这个,绑定状态下不能用RowCount,系统会报错,本身系统也提示说了那是非绑定用的。
{
}
}
2、但是,如果网格中的列是根据存在数据库中显示与否标识动态加载的话,比如上面这些,只显示citem_no,citem_name,nqty 此时,程序执行的逻辑就不对了,或者根本不跳到下一行,核心问题还是,Col属性与Columns.Count没有可比性,此时,col的值应该是2,通过测试,我始终发现,Col是创建列时的定死的值,甚至你在运行起来程序,拖动列调了位置,Col属性是不变的。我也用VisbleCols属性试了,代表显示了多少列,Col与它也没有可比性。

马工,我上面说的对吗?
>>>>>所以,基于以上原因,我继承重写了C1DataColumn为一个新对象,给它加了一个像微软的DataGridView中的列的index一样的属性,给主网格加了一个int_count属性,在动态创建列时,每建一个列,当是显示的, int_count加1,并且赋值index属性等于int_count,这样,在KEYdown事件里,我比对列的index是否等于int_count。这种方法临时实现了需求,但若用户在运行时,拖动调整列的位置,还是不行。因为,C1TrueDBgrid不像微软的DataGridView一样,列有个DisplayIndex属性,拖动时是实时变的。若要从根本上解决,看来,也得弄个DisplayIndex属性,并且在列的位置调整时,更新这个属性。
马工,我说的是否正确?还是说不正确,把简单问题复杂化了?
如果正确,也希望别人遇到此问题,有些帮助。

16 个回复

正序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-5-20 14:17:21
17#
好的,有新的bug欢迎再发新帖。也感谢提供产品改进建议
回复 使用道具 举报
yin_tb
中级会员   /  发表于:2021-5-20 12:11:38
16#
可以了,马工,感谢。只是没想到,弄的这么复杂,要是不懂LINQ,调用Enumerable,还真搞不定。很多新手可能看半天才能明白。为了取一个当前显示的总列数,用这些方法有些复杂。我觉得对C1TrueDBGrid你得给研发提以下改进:
1、当前name是readonly的,和Caption一样,这在英文国家也还行,但在中文国家不适用,因为咱们中国人编码用英文,但显示用中文,所以,应该把它两个分开,是不同的属性。你像FlexGrid就专门有name,index,
Caption等属性,还专门有Col 和Row,调用起来方便舒服。以下datafield是绑定的列名:
虽然默许的调用Splits[0].DisplayColumn("datafield").DataColumn......或 Columns("datafield")这样也行,但总感觉很不适应,

就像上次咱们沟通单元格的锁定问题, 我开始用e.column.name="citem_no"这样,后来才想到,不能用name,因为name和Caption一样,是中文。
得改成 e.column.datacolumn.datafield.tostring() ="citem_no"
取一个简单的值,得转几转。
VS自带的DataGridView,也是美国研发吧, name和Caption分离,DGV1.CurrentROW是当前焦点行,DGV1.CurrentCell是当前单元格,DGV.DisplayColumnsCount是显示的列数,DGV.ColumnsCount是总列数,DisplayIndex是显示位置 。我也感觉C1有很多它没有的优点,但有些地方觉得麻烦,呵呵。现在基本摸清了C1TrueDBgrid的方法了,啥时用displayColumns啥时用columns,啥时要比对转换成datafield,反正是代码长。


2、封装多加几个属性,把咱们用LINQ获取的,直接封装成属性。虽然我自己现在准备这样做,但标准产品那样其它用户调用起来方便。


3、还有个BUG,我抽空在DEMO里呈现,就是当前网格绑定到了datatable,正在编辑模式,如果从数据库中读取格式数据,清除所有列,重新创建列,按新布局排列,再绑定到当前正在编辑的datatable,有时,网格里会变成红X号,应该是因为刷新的问题,或是fetchstyle啥原因。
临时就说这些吧,费点事功能也都差不多了。




评分

参与人数 1金币 +1000 收起 理由
Richard.Ma + 1000 感谢提供产品改进建议

查看全部评分

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-5-19 00:09:58
14#
好的,明天早上验证后给你回复结果
回复 使用道具 举报
yin_tb
中级会员   /  发表于:2021-5-18 18:15:43
13#
demo我做的很简单,DataTable的定义在program里,为了以后交流问题方便,我以后就始终用这套代码了。Form的Load事件里,手动创建了几列,隐藏【规格】列,然后绑定到DataTable,执行1加载数据,可以增行,然后回车,你能试出效果来,如果把【规格】显示出来,你会发现回车正常换行
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-5-18 18:07:06
12#
好的,也感谢您给我们产品提供的建议, 我验证完你的dmeo给你回复
回复 使用道具 举报
yin_tb
中级会员   /  发表于:2021-5-18 17:38:55
11#
本帖最后由 yin_tb 于 2021-5-18 17:56 编辑

这个问题应该算BUG,我做了DEMO展现这个问题。不过跟马工学了一点,用LINQ,原来知道这个,只是项目太忙,一直没时间学习,得抽空充电了,我在项目里用了笨办法,创建列时根据是否显示累加一个值来记忆有多少列显示,呵呵。在DEMO中,我不显示中间的规格列。马老师说的对,弄DEMO最直观,咱们交流了这么多帖子,也怪我始终没有呈现问题。
基于此,目前这个问题,还是得用我开头的代码,用写的index属性比对,然后用你LINQ那段获取显示的列数比对,至少我不用自己累加显示的列数了。另外,VisibleCols属性的值不对,字面上是显示的列数,DisplayColumns.Count的值也不对,至少从字段来说,Columns.Count是总列数,DisplayColumns.Count,怎么说也是显示出来的列数吧,这也是BUG,回头我统一说吧。
等你看完附件DEMO,我再补充C1TrueDBgrid需要改善哪些东西 吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-5-18 16:07:04
10#
嗯,有问题可用再发帖
回复 使用道具 举报
yin_tb
中级会员   /  发表于:2021-5-18 15:59:31
9#
我用你的方法试试,感觉好像对,呵呵
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-5-18 15:54:22
8#
对代码进行了一点修改,通过
  1. var visiableColCount = c1TrueDBGrid1.Splits[0].DisplayColumns.Cast<C1DisplayColumn>().Where(t => t.Visible).Count();
复制代码

可用获取到可见行的数量,

另外下面附了一个隐藏最后一列的方法,也是类似的思路,已测试列隐藏后也是没有问题的

  1.         private void c1TrueDBGrid1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  2.         {
  3.             var visiableColCount = c1TrueDBGrid1.Splits[0].DisplayColumns.Cast<C1DisplayColumn>().Where(t => t.Visible).Count();
  4.             c1TrueDBGrid1.DirectionAfterEnter = C1.Win.C1TrueDBGrid.DirectionAfterEnterEnum.MoveRight;
  5.             if (c1TrueDBGrid1.Col == visiableColCount - 1)
  6.             {
  7.                 c1TrueDBGrid1.DirectionAfterEnter = C1.Win.C1TrueDBGrid.DirectionAfterEnterEnum.MoveNone;
  8.                 c1TrueDBGrid1.Row = c1TrueDBGrid1.Row + 1;
  9.                 c1TrueDBGrid1.Col = 1;
  10.             }

  11.         }

  12.         private void 隐藏最后一列ToolStripMenuItem_Click(object sender, EventArgs e)
  13.         {
  14.             c1TrueDBGrid1.Splits[0].DisplayColumns.Cast<C1DisplayColumn>().Where(t => t.Visible == true).Last().Visible=false;
  15.         }
复制代码
回复 使用道具 举报
yin_tb
中级会员   /  发表于:2021-5-18 15:45:53
7#
我又发现我说的也不对,我跟踪了一下,COL是变的,真晕了,呵呵。我再试试
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部