当前位置:编程学习 > C#/ASP.NET >>

【求教】哪位大佬和牛人知道如何实现美国大公司GE公司的软件中如下非常实用的功能?

如图所示:

一、美国大公司GE公司的一个软件产品中有一个非常实用的功能,就是一个类似DataGridView的自定义的控件用来以网格表格的方式显示符合某些条件的患者做放射科检查之后报告医生是否对相应的检查做了文字报告等信息的时候,在列头那行的下面紧接着那行(我用红色框框框起来的那行)是定制的,可以专门用来对查询出来的数据输入对应的查询条件进行过滤,比如我在列头(姓名)的下面紧接着的下面那个单元格输入汉字(陈)那么下面的网格中就以姓名为汉字(陈)开头作为过滤条件进行过滤!

另外说明一下这个东东还实现了点击某列的列头就可以实现按照该列对应的数据进行排序,而且排序之后列头那行的下面紧接着那行用于过滤的定制的行的位置还是不变(也就是说这行是不参与排序的)!

二、它还有个非常实用的功能就是比如姓名那列可以根据这个患者对应的检查是处于已经做了报告的状态还是处于还没做报告的状态来在显示的姓名的前面加不同的图标来标示,这个功能也挺不错的!

感觉我上面提到的这些功能挺实用的,尤其是我最开始提到的第一个功能!

不知道CSDN有没有大佬和牛人知道怎么实现这个功能?其实这个功能也是GE国内的开发人员用JAVA开发的软件,这个现实数据的网格组件也是在JAVA自导的组件的基础上扩展的,只是由于太熟悉我反而不好意思去问他们,所以特意来CSDN请教一下是否有编程这块的大佬和牛人知道怎么做,还望指点迷津,非常感谢!


--------------------编程问答-------------------- 估计你是没能力自定义控件了,你去看看dev系列的或者componentone系列组件是否有着功能 --------------------编程问答-------------------- 顶你一个 这个还是很有用的 我是没有好的方法 --------------------编程问答-------------------- 感觉 datagridview 也能做这个 就是处理起来比较繁琐 --------------------编程问答-------------------- datatable.select --------------------编程问答-------------------- 我们Team正在研发一个组态软件,用WPF开发界面。你所说的这种功能对于我们来说不是什么新鲜东西。

我们公司恰好在某些业务上算是GE公司的竞争对手。

--------------------编程问答-------------------- 楼上给个建议 别说你们做的  --------------------编程问答-------------------- 由于datagridview这方面做的比较死。想实现挺麻烦的。
自己以前想在里面做些扩展,发现他的很多函数全都写在一起。基本没分开,而且基本没提供啥扩展功能。
相比系统自带的listview要差很多。
 
如果实在想做可以试试:通过继承datagridview.从重绘的地方。设置偏移,以及区域大小。然后自己重缓列头。再动态的添加控件。
做起来肯定不会这么顺利。


顺便请楼主试试我写的excel(只是某些方面类似)。里面有单元格绑定。数据的过滤需要你写个过滤的代码。
http://www.cnblogs.com/dataexcel/archive/2012/09/20/2659896.html --------------------编程问答--------------------
引用 7 楼  的回复:
通过继承datagridview.从重绘的地方。设置偏移,以及区域大小。然后自己重缓列头。再动态的添加控件。


稍微深入一下编程实战就会用了哦,
--------------------编程问答-------------------- 感觉用wpf并非难事,改改listview的几个template就能实现 --------------------编程问答-------------------- 最基本的Filter、列排序、图标。。。DevExpress和ComponentOne这类高级控件库基本都实现了这些功能,给你的建议是:
1.用破解版
2.买正版
3.等天上掉馅饼 --------------------编程问答-------------------- 把列头高度设的大些,重绘时上一半画标题,下一半画成数据区的样子,鼠标点击时动态加个编辑控件上面.想想似乎不太复杂吧 --------------------编程问答--------------------
引用 5 楼  的回复:
我们Team正在研发一个组态软件,用WPF开发界面。你所说的这种功能对于我们来说不是什么新鲜东西。

我们公司恰好在某些业务上算是GE公司的竞争对手。

呵呵,没想到这次发帖引来了这么多技术高手、大佬、牛人,谢谢大家的支持!

其实我是有GE做的这个东西的部分代码的,只是有些包的代码我没有,所以只能反编译,反编译的东西有些地方还是看得不是很清楚!根据我看的那部分代码感觉不是很难的,只是涉及到没有代码的那部分有些不是很清楚的地方!

想请教一下如果扩展datagridview可否实现这个功能?如果不行的话有什么好的思路?

我已经在网上找了好多个无私的技术牛人免费共享的扩展datagridview的代码,现在已经试过一种思路就是把列头通过重画分成两行,上面的那行显示真正的列头,下面那行用来显示作为过滤的那行!按照这种思路我现在尝试的结果是,貌似现在我通过重画列头还是只显示出第一行,下面那行不知道是什么原因没有画出来!

而且我也不清楚按照这种思路,是否可以做到列头的第一行(显示真正的列头的那行)不能聚焦和编辑,而列头的第二行(用于输入过滤条件的那行)可以聚焦和编辑?

下面的代码是我扩展DataGridView的代码,主要重写OnCellPainting来实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication21
{
    public partial class UCFilterDataGridView : DataGridView
    {
        public UCFilterDataGridView()
        {
            InitializeComponent();
        }
        //重寫表頭
        protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
        {
            try
            {
                //行标题不重写
                if (e.ColumnIndex < 0)
                {
                    base.OnCellPainting(e);
                    return;
                }

                RectangleF uhRectangle;
                SolidBrush gridBrush = new SolidBrush(this.GridColor);
                SolidBrush backColorBrush = new SolidBrush(e.CellStyle.BackColor);
//                SolidBrush backColorBrush = new SolidBrush(Color.Blue);
                Pen gridLinePen = new Pen(gridBrush);
                StringFormat textFormat = new StringFormat();
                textFormat.Alignment = StringAlignment.Center;

                //绘制表头
                if (e.RowIndex == -1)
                {
//                    uhRectangle = new Rectangle(e.CellBounds.Left, e.CellBounds.Top, e.CellBounds.Width - 1, e.CellBounds.Height - 1);
                    uhRectangle = new Rectangle(e.CellBounds.Left, e.CellBounds.Top, e.CellBounds.Width , e.CellBounds.Height*4);
                    //画矩形
                    e.Graphics.FillRectangle(backColorBrush, uhRectangle);
                    //划中间线
                    e.Graphics.DrawLine(gridLinePen, uhRectangle.Left, e.CellBounds.Top + e.CellBounds.Height / 2 , uhRectangle.Right, e.CellBounds.Top + e.CellBounds.Height / 2 );
//                    e.Graphics.DrawLine(gridLinePen, uhRectangle.Left, e.CellBounds.Top + e.CellBounds.Height / 2 + 1, uhRectangle.Right, e.CellBounds.Top + e.CellBounds.Height / 2 + 1);
                    base.OnCellPainting(e);
                    e.Handled = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "Error");
            }
        }
    }
}



呵呵,本来有好几个网友的留言都想回复的,不过貌似论坛如果最近的三个回复都是自己的就没法再回复了,上次我就是这样的原因而导致没法顶贴沉贴了,所以就把回复所有网友的内容放一个里面,非常感谢大家的热心参与和指导! --------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼  的回复:
估计你是没能力自定义控件了,你去看看dev系列的或者componentone系列组件是否有着功能

呵呵,感觉这个问题你还是挺有把握的,不妨说说你的思路。 --------------------编程问答-------------------- 最好把datagridview的表头绘制给屏蔽掉,然后自己来绘表头,至于输入嘛,
可以放几个TextBox上去输就行了。 --------------------编程问答--------------------
引用 15 楼  的回复:
最好把datagridview的表头绘制给屏蔽掉,然后自己来绘表头,至于输入嘛,
可以放几个TextBox上去输就行了。

呵呵,谢谢你的建议,你的主意听起来应该是一种值得一试的方法!

之前我也曾经考虑过我所能想到的可能,你建议的方法我也想过,不过说实话由于我对C#的熟悉程度还不象你这么高,对于具体怎么实现我心里还不是很有底,请问可否说得稍微详细一点!

另外一点就是我希望最好是自己定制一个控件(比如说在datagridview的基础上扩展),由于这个控件不只会用到一个地方,不同的地方显示的数据可能不一样(是不同的表里面的),因此带来一个问题就是要显示的列数可能是变化的,遇到这种情况有如何自动的生成与列数对应数目的TextBox用于输入呢?

GE公司用JAVA做的那个东西我大概看了一下,它那种的实现方法貌似不是我们想到的这种方法而是对下面显示的数据行进行处理,不过我觉得条条大路通罗马,只要能够实现我们需要的功能的方法都值得一试!

当然如果思路比较开阔再加上动手能力比较强的话我们可以在几种实现方法中选一种我们觉得最合适自己需要的! --------------------编程问答-------------------- 重绘表头的方法有参考资料,你搜一下就能查到,

列不一样不要紧,有多少列则生成多少文本框,可以看一下帮助如何动态创建控件,
至于对下面的数据过滤,在文本框输入时就过滤下面的数据,用程序实现也不是难事,

不过不一定只有文本框,可能还有下拉框,或者日期框等,
比如性别,最好可以下拉选择男女,而不是手输(当然也可以手输),日期就用日期框,

这个可以根据你的列数据类型来自动选择控件,也可以不用那么复杂,可以全部用文本框,
对于象性别的输入,可以用自动完成功能,日期可以用弹出框,这样可以保证控件统一
--------------------编程问答-------------------- 实话说,自己写控件是很麻烦的事情,
表格涉及到的功能非常多,Excel也是表格,
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,