【发布时间】:2014-02-19 08:36:07
【问题描述】:
我有一个包含三个选项卡的表单。现在每个选项卡都有大约 15 - 20 个功能。因此,当组合起来时,我有大约 50 个方法,处理这么大的类变得相当麻烦。有没有更好的方法来处理这么大的文件。这些方法是否有帮助: 1)三个部分类 2)每个选项卡的单独类(非部分) 3) 地区
请分享您的经验。 提前致谢!
【问题讨论】:
标签: c# winforms tabs partial-classes regions
我有一个包含三个选项卡的表单。现在每个选项卡都有大约 15 - 20 个功能。因此,当组合起来时,我有大约 50 个方法,处理这么大的类变得相当麻烦。有没有更好的方法来处理这么大的文件。这些方法是否有帮助: 1)三个部分类 2)每个选项卡的单独类(非部分) 3) 地区
请分享您的经验。 提前致谢!
【问题讨论】:
标签: c# winforms tabs partial-classes regions
您可以将每个选项卡分成单独的用户控件。或者甚至比这更细化。
【讨论】:
对于您的TabControl 中的每个TabPage,请执行以下操作:
将Panel 从工具栏中拖入TabPage。将面板的Dock属性设置为Fill。
在解决方案资源管理器中,创建一个 Windows 窗体类型的新元素。
将新表单中的FormBorderStyle 设置为None
在包含 TabControl 的表单中使用以下代码
public MainFrm()
{
InitializeComponent();
var subFrm = new SubFrm();
subFrm.TopLevel = false;
subFrm.Dock = DockStyle.Fill;
panelInTabPage.Controls.Add(subFrm);
subFrm.Show();
}
现在您可以将每个子表单的逻辑存储在其自己的源文件中。
【讨论】:
对于静态选项卡,我通常将它们分成自己的部分类。我尝试将任何共享的函数放在一个单独的类中并在需要时调用。
【讨论】:
我之前遇到过这个问题,并且要求我们不使用第三方控件,以便可以轻松地将应用程序移交给第三方。为了解决这个问题,我们有一个主窗体,我们设置IsMdiContainer = true 并将TabControl 停靠到主窗体的到,这样只有TabItems 可见而内容不可见。
现在,这不是最好的,但它解决了问题,并允许您将每个选项卡的内容编写为具有自己的类等的单独表单。在主表单上设置加载事件以将相关表单加载到你TabControl。
注意,您可以用UserControls 替换后面的Forms,但您将使用将主窗体作为MdiContainer 的能力,并且必须使用Panel 来停靠控件并添加一些代码以将每个用户控件置于最前面。
private void MainForm_Load(object sender, EventArgs e)
{
try {
LoadMdiForms();
}
finally {
mdiTabControl.SelectedIndex = 0;
}
}
然后设置List<Form> MdiChildForms { get; set; } 并添加表单
private void LoadMdiForms()
{
createDbForm = new CreateDbForm();
MdiChildForms.Add(createDbForm);
valForm = new ValidationForm();
MdiChildForms.Add(valForm);
// et al.
foreach (Form mdiChild in MdiChildForms)
{
mdiChild.MdiParent = this;
mdiChild.ShowInTaskbar = false;
mdiChild.Show();
}
}
现在设置一个MainForm_MdiChildActivate 事件处理程序
private void MainForm_MdiChildActivate(object sender, EventArgs e)
{
if (this.ActiveMdiChild == null)
mdiTabControl.Visible = false; // If no child forms, hide tabControl
else
{
// Child form always maximized.
this.ActiveMdiChild.WindowState = FormWindowState.Maximized;
// If child form is new and has no tabPage, create new tabPage.
if (this.ActiveMdiChild.Tag == null)
{
// Add a tabPage to tabControl with child form caption
TabPage tp = new TabPage(this.ActiveMdiChild.Text);
tp.Tag = this.ActiveMdiChild;
tp.Parent = mdiTabControl;
mdiTabControl.SelectedTab = tp;
this.ActiveMdiChild.Tag = tp;
this.ActiveMdiChild.FormClosed += new FormClosedEventHandler(ActiveMdiChild_FormClosed);
}
// Make visible if required.
if (!mdiTabControl.Visible)
mdiTabControl.Visible = true;
}
}
现在在 TabControl SelectedIndexChanged 事件上添加事件处理程序
// If child form closed, remove tabPage.
private void ActiveMdiChild_FormClosed(object sender, FormClosedEventArgs e)
{
((sender as Form).Tag as TabPage).Dispose();
}
private void mdiTabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if ((mdiTabControl.SelectedTab != null) &&
(mdiTabControl.SelectedTab.Tag != null))
{
this.BeginUpdate();
(mdiTabControl.SelectedTab.Tag as Form).Select();
this.EndUpdate();
}
}
就是这样。你应该有一个工作的TabControl 和原子TabItems。
我希望这会有所帮助。
【讨论】:
一些处理 GUI 组件的方法:
对于您的特定问题,您可以将每个选项卡分隔为独立的自定义用户控件。
一些解决方法:http://msdn.microsoft.com/en-us/library/aa302342.aspx
【讨论】: