找回密码
 立即注册

QQ登录

只需一步,快速开始

nelsen

高级会员

14

主题

52

帖子

1384

积分

高级会员

积分
1384

活字格认证微信认证勋章

nelsen
高级会员   /  发表于:2010-11-2 19:24  /   查看:8701  /  回复:8
MR中可否实现树型目录的子母表(如附图)?在母表中显示统计累计数,子表显示详细的各条记录数据。另外可否实现整行数据的选择(不单是选RowHeaderCell而实现的整行选择,而且要实现无论点击该行的任何一个单元格就选择整行)

本帖子中包含更多资源

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

x

8 个回复

倒序浏览
barrylei
中级会员   /  发表于:2010-11-3 08:37:00
沙发

回复 1# nelsen 的帖子

MR暂时没有内置子母表的功能,但是通过写代码可以做到基本的实现,请参考下面3楼Robert的回复。
关于整行选择,只要把GcMultiRow.ViewMode属性设置成Row就可以了。
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2010-11-3 12:23:00
板凳
刚看到这个帖子,做了一个Demo。
这个Demo实现母子表的核心思想是把子表做成一个自定义Cell(在源代码GcMultiRowCell.cs文件中定义),然后把这个Cell放到RowSection任意位置,比如下边。在RowHeaderCell上又放了个ImageCell,通过在ImageCell的Click事件中设置自定义Cell的Expand属性来实现展开和收起子表。

附件中有源代码和可执行程序。运行程序需要安装MultiRow。
做的比较粗糙,有些细节是写死的,有什么问题欢迎回帖讨论:)

本帖子中包含更多资源

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

x
回复 使用道具 举报
nelsen
高级会员   /  发表于:2010-11-3 12:50:00
地板
明白了。MR最好能尽快实现子母表功能,这样表格实现起来就比较完美了。另外能否按要求控制单元格输入字符。
回复 使用道具 举报
barrylei
中级会员   /  发表于:2010-11-3 12:54:00
5#

回复 4# nelsen 的帖子

能具体描述一下“能否按要求控制单元格输入字符”的用例吗?以方便我们理解和解答。
回复 使用道具 举报
nelsen
高级会员   /  发表于:2010-11-3 13:00:00
6#
刚刚看到楼上朋友的例子,先试下看看
回复 使用道具 举报
nelsen
高级会员   /  发表于:2010-11-3 13:10:00
7#

回复 5# barrylei 的帖子

例如只允许输入数值和百分比“%”和小数点等符号,或是只允许输入整数数值,其它英文字母,中文字都不允许输入。还有可否控制表格中某个单元格输入的数值必须是另一个单元格的整倍数,如非整倍数就提示。
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2010-11-3 14:07:00
8#

回复 7# nelsen 的帖子

1. 如果希望只输入数字的话可以使用NumericUpDownCell,用法和功能完全兼容微软标准的NumericUpDown。

2. 如果希望输入特定格式的话可以使用MaskedTextBoxCell,设置Mask属性,用法和功能完全兼容标准的MaskedTextBox。
具体Mask属性的规则,请参考MSDN: http://msdn.microsoft.com/zh-cn/ ... .maskedtextbox.mask

3. 如果是在特定列表中选择,推荐使用ComboBoxCell或RadioGroupCell。

4. 对于更高级的输入控制可以处理EditingControl的输入事件,如KeyPress等。

  1.        // 控制一个Cell只能输入小写字母。
  2.         private void gcMultiRow1_EditingControlShowing(object sender, GrapeCity.Win.MultiRow.EditingControlShowingEventArgs e)
  3.         {
  4.             // 先减下防止挂多次
  5.             e.Control.KeyPress -= new KeyPressEventHandler(Control_KeyPress);
  6.             e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress);
  7.         }

  8.         void Control_KeyPress(object sender, KeyPressEventArgs e)
  9.         {
  10.             if (e.KeyChar >= (int)('a') &amp;&amp; e.KeyChar <= (int)'z')
  11.             {
  12.                 e.Handled = false;
  13.             }
  14.             else
  15.             {
  16.                 e.Handled = true;
  17.             }
  18.         }
复制代码
5. 如果是输入之后校验,可以使用MultiRow内置的Validator类型,或者通过处理CellValidating事件来校验Cell的值。
回复 使用道具 举报
barrylei
中级会员   /  发表于:2010-11-3 15:55:00
9#
补充一下8# Robert的回复的第五点:关于如何使用MR的校验功能
MultiRow提供了一些内置的校验功能,使用步骤如下
1. 在设计器里选择一个Cell
2. 然后到PropertyGrid窗口找到它的Validators属性,打开,会弹出下面的Dialog。我们默认提供了10种校验,你可以选择其中一种。如下图。

3. 选择好了以后,例如,我们选择RangeValidator,然后在右边的PropertyGrid设置它的属性,如MaxValue,MinValue来确定它的校验范围
4. 同样,在PropertyGrid选择Actions属性,打开它,一个新的Dialog会弹出,如下图。这个属性的意思是校验失败的时候出现什么效果,例如,显示个错误Icon,弹个Tip等。选择其中你所需要的,例如,IconNotify。

5. 那么当程序运行起来后,用户输入一个不在你所设定范围的值,然后离开这个单元格的时候,一个Icon就会提示用户。

关于自定义校验逻辑,如你的用例所说,要校验一个Cell的值是另一个Cell的值的整数倍,那么这就属于一个具体的特殊的商业业务逻辑,需要自己写代码。代码如下:
  1.   //继承CellValidator类,写自己的校验逻辑
  2.     public class MyValidator : CellValidator
  3.     {
  4.         protected override bool Validate(ValidateContext context)
  5.         {
  6.             //取得当前单元格的值
  7.             object currentValue = context.EditedFormattedValue;
  8.             //取得要比较的单元格的值
  9.             object otherCellValue = context.GcMultiRow[context.CellPosition.RowIndex, 0].Value;

  10.             {
  11.                 //在这里,写你的教研逻辑,正确返回True,不正确返回False,下面的Code只是简单的Demo以下,你要自己根据你的业务需求写如何做判断,
  12.                 //例如,一个值时另一个值得倍数等
  13.                 if (currentValue.ToString() == otherCellValue.ToString())
  14.                     {
  15.                         return true;
  16.                     }
  17.                     else
  18.                     {
  19.                         context.ValidateInfo = &quot;这个信息提示最终用户&quot;;
  20.                         return false;
  21.                     }
  22.             }

  23.         }
  24.     }

  25.             MyValidator myvalidator = new MyValidator();
  26.             myvalidator.Actions.Add(new IconNotify());
  27.             this.textBoxCell2.Validators.Add(myvalidator);

复制代码

本帖子中包含更多资源

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

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