C# 以一种形式显示数据组的最佳方法?

C# 以一种形式显示数据组的最佳方法?,c#,winforms,C#,Winforms,我想创建一个windows窗体。这个表单是单独显示数据组的,我的目标是在同一个表单窗口中显示数据组,而不是打开多个窗口 例如,每组数据由一个作业#定义。用户将希望一次查看X个不同的作业(范围通常为1-5,但可能更多)。我希望每个作业有4个DataGridView,加上文本框中的各种识别和汇总数据 我正在研究使用TabPages/Tab控件。我最初的想法是让用户单击不同的选项卡,查看他们预先选择的作业的数据。然而,从我所看到的,这些选项卡的行为似乎不像类。有没有更好的方法来实现这一点,或者有什么方

我想创建一个windows窗体。这个表单是单独显示数据组的,我的目标是在同一个表单窗口中显示数据组,而不是打开多个窗口

例如,每组数据由一个作业#定义。用户将希望一次查看X个不同的作业(范围通常为1-5,但可能更多)。我希望每个作业有4个DataGridView,加上文本框中的各种识别和汇总数据

我正在研究使用TabPages/Tab控件。我最初的想法是让用户单击不同的选项卡,查看他们预先选择的作业的数据。然而,从我所看到的,这些选项卡的行为似乎不像类。有没有更好的方法来实现这一点,或者有什么方法让选项卡像类一样工作?这样每个选项卡都有一个作业文本框、4个不同的DataGridView等,这样我就可以轻松创建和显示任意数量的作业了

例如,每个选项卡将有4个DataGridView、8个文本框、标准化标签和标准化布局


那么使用标签是个好主意吗?使用其他WinForm控件?

这里至少有两种解决方案:

  • 创建一个自定义
    面板
    ,其中包含您想要的所有控件(
    TextBox
    DataGridView
    ,…),并对其进行设计,使其看起来最适合您。然后将每个
    面板
    添加到
    选项卡控件
    的每个
    选项卡页面

  • 创建一个新的自定义
    TabPage
    ,并将自定义
    TabPage
    添加到
    TabControl.TabPages
    中,而不是标准的
    TabPage

  • 我认为,如果您可以使用代码(而不是拖放)初始化所有内容,则可以使用第二种方法,因为要支持
    drag-n-drop
    ,您可能需要编写一个自定义
    TabControl
    。所以第一种方法是可行的。您可以将
    面板
    替换为
    表单
    ,设置
    表单.TopLevel=false
    ,您可以将该表单添加到任何容器控件中。使用
    表单
    ,您可以轻松地使用
    拖放
    来设计和组织控件

    下面是一些代码,可以帮助您了解:

    public class TabPageClient : Form {
        public TabPageClient(){
            InitializeComponent();
            Dock = DockStyle.Fill;
            TopLevel = false;
            FormBorderStyle = FormBorderStyle.None;
        }
        //.... other code 
        //I think this is important
        //You should define some Properties and methods to control the data flowing into and out from your TabPageClient. 
        //You can also support some method to add/remove the controls dynamically.
    }    
    
    考虑到拖放要求,我认为使用
    UserControl
    可能更好:

    public class TabPageClient : UserControl {
       public TabPageClient(){
          InitializeComponent();
          Dock = DockStyle.Fill;
       }
    }
    

    对于
    UserControl
    ,您应该将类放在一个单独的*.cs文件中,编译您的项目,然后您可以在
    ToolBox
    窗口(最顶部)中看到它。只需像其他控件一样拖放即可。

    我个人更喜欢网格细节视图。我们在软件中大量使用的东西。表单有一个垂直对齐的
    SplitContainer

    在顶部面板中,添加某种类型的列表(
    ListBox、ListView、DataGridView
    …任何可以加载列表然后对选择做出反应的控件)

    在底部面板中,您还有更多选项。简单地说,您可以使用
    TableLayoutPanel
    ,然后设置行/列以提供您喜欢的嵌入式控件的任何排列,例如显示数据的网格阵列。我想根据您的模型,您将有一个
    列样式
    和四(4)个
    行样式
    。然后在每行中添加一个网格

    这样,您可以将所有内容放在一个地方…一个“屏幕”,如果您愿意的话(无需翻页)。您可以对列表中的选择做出反应,以决定在网格中显示哪些数据。然后,您只需要一点代码(我希望是一个类),在提供数据的类和显示数据的表单控件(网格)之间建立接口

    这里的另一个好处是,通过列表演示,您可以在任何时候拥有五(5)份以上的工作。事实上,通过滚动,您可以随心所欲地滚动(不限于显示进入pot之前的选项卡数量)

    此外,您将重新使用网格。只需刷新所选列表项的显示数据。如果新鲜度不是问题,您甚至可以预加载并缓存所有内容


    也可以考虑直接绑定到数据源,如果这是一个选项。

    用户是如何询问这些工作的?有名单吗?他们在什么地方输入了一个数字?一旦他们选择了,他们能“结束”工作吗?也就是说,“打开的作业”列表是否需要动态更改,以便在作业来来去去时自动重新配置整体视图?他们会在零件号中打开搜索窗口类型以筛选出作业,然后选择他们想要查看的每个作业,可能需要双击。我必须将此信息发送回第一张表格。我不知道增加关闭工作的能力是否至关重要。可能只是为了重新开始而删除所有工作。不会动态添加和删除作业。您认为用户是否希望/需要一次查看多个作业。比如说,为了比较工作之间的数据?或者您打算像在您的模型中那样强制使用“一次一个作业”视图吗?不幸的是,一次查看多个作业不是很可行,因为一个表至少有11列。屏幕空间是一个问题。不过,添加摘要选项卡/控件可能是一个有趣的想法。嗯,好的,我正在查看面板。我想我可能需要学习如何单独使用代码添加控件才能工作。@Matt即使使用
    面板
    ,您也可能需要按代码添加控件,因为我们没有专门的
    面板
    设计图面
    ,我们只有一个用于
    表单
    用户控件
    。我想你可以试试
    Form
    ,改为设置它的
    FormBorderStyle=FormBorderStyle.None
    Form.TopLevel=false
    。然后,您可以将控件拖放到表单上,并使用此表单添加到
    选项卡
    。此建议可能最终会解决一些物理问题