【问题标题】:Best way to display groups of data in one form?以一种形式显示数据组的最佳方式?
【发布时间】:2013-08-14 01:49:22
【问题描述】:

我正在寻找创建一个 Windows 窗体。此表单用于单独显示数据组,我的目标是在同一个表单窗口中执行此操作,而不是打开多个窗口。

例如,每组数据由 Job# 定义。用户将希望一次查看 X 个不同的 Job#(范围通常为 1-5,但可能更多)。我希望每个 Job# 有 4 个 dataGridViews 以及文本框中的各种标识和汇总数据。 Initial Example Concept

我正在研究使用 TabPages/Tab Controls。我最初的想法是让用户单击不同的选项卡来查看他们预先选择的那些工作的数据。但是,这些选项卡的行为似乎不像我所看到的类。是否有更好的方法来解决这个问题或让选项卡像类一样工作?让每个选项卡都有一个 Job TextBox、4 个不同的 DataGridView 等。这样我就可以轻松创建和显示任意数量的作业?

例如,每个 Tab 会有 4 个 dataGridView,可能有 8 个文本框、标准化标签和标准化布局。

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

【问题讨论】:

  • 用户如何请求这些工作?有清单吗?他们在某处输入一个数字?一旦他们选择了,他们可以“关闭”一份工作吗? IE。 “空缺职位”列表是否需要动态,以便随着职位的来来去去自动重新配置整体视图?
  • 他们会打开一个搜索窗口,输入零件号以过滤掉工作,然后选择他们想要查看的每个工作,可能需要双击。我必须将此信息发送回第一个表格。我不知道增加关闭工作的能力是否至关重要。可能只是删除所有工作以重新开始。不会动态添加和删除作业。
  • 您认为用户是否希望/需要一次查看多个作业。比如说,为了比较工作之间的数据?还是您打算像在您的模型中那样强加“一次一项工作”的观点?
  • 不幸的是,一次查看多个作业不太可行,因为一张表至少有 11 列。屏幕空间是个问题。但是,添加摘要选项卡/控件可能是一个有趣的想法。

标签: c# winforms


【解决方案1】:

这里至少有2个解决方案:

  1. 创建一个自定义的Panel,包含您想要的所有控件(TextBoxDataGridView、...),对其进行设计以使其看起来最适合您。然后将每个Panel 添加到您的TabControl 的每个TabPage

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

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

这里有一些代码可以帮助你弄清楚:

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 窗口(最顶部)中看到它。只需像其他控件一样拖放即可。

【讨论】:

  • 嗯,好吧,我正在研究面板。我在想我可能必须学习如何单独使用代码添加控件才能使其正常工作。
  • @Matt 即使使用Panel,您可能仍然需要通过代码添加控件,因为我们没有专用的Design Surface 用于Panel,我们只有一个用于@ 987654346@ 和UserControl。我想你可以试试Form,设置它的FormBorderStyle = FormBorderStyle.NoneForm.TopLevel = false。然后您可以将控件拖放到表单上并使用此表单添加到您的TabPage
  • 这个建议最终可能会解决一些物理需求,但对选择正确的布局没有任何帮助......在我看来,这是最难的部分。先设计,再构建。
【解决方案2】:

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

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

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

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

这里的另一个好处是,通过列表演示,您可以在任何时候处理超过五 (5) 个工作。事实上,随着滚动,你喜欢多少就多少(不限于显示到锅之前的标签数量)。

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

如果可以的话,也可以考虑直接绑定到数据源。

【讨论】:

  • 嗯,这听起来像是一种易于实现的方法,是的,它会很容易显示更大的项目列表以供查看。我不必通过代码来实现表单对象,尽管无论如何我应该对此更加熟悉。几个“dataTables”数组可以解决这个问题。
  • 我愿意。坦率地说,我不是设计师的粉丝。通过在代码中添加控件,我获得了更多的控制权,并且它很多更明显地发生了什么。但是您需要对未设置某些内容时的默认值有所了解,因为与设计器不同,在代码中执行此操作时无法轻易看到默认值。选择你的毒药。此外,当您想要一些额外的东西时,不要害怕创建自己的继承控件。 DotNet 让制作干草变得非常容易。
  • 另外,由于您是新手...TableLayoutPanel(通常是Panels)是非常灵活的控件。如果你愿意,你可以在其中一个里面放一个。例如,想想 HTML 中的嵌套表格。相同的概念适用。控件内部的控件,其他控件内部的控件。尽你所能。您可以制作一些不错的(如果复杂的话)布局。
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2011-04-27
  • 2012-05-02
相关资源
最近更新 更多