天道酬勤,学无止境

更改和传递 tabControls tabPage 内的内容(Changing and passing content inside tabControls tabPage)

问题

我在 Windows 窗体应用程序中工作并有以下问题。 我在我的应用程序中使用 tabControl 并且当用户执行特定操作时需要更改某些 tabPages 中的内容。

例如,tabPage 包含一个文本区域和一个按钮,当用户单击文本区域内的按钮信息时,应该以某种方式存储,并且同一个 tabPage 应该显示新内容,例如更多文本区域、按钮等,我认为这样做更容易使用其中的视图,因此可以隐藏一个视图,可以显示另一个视图。

回答1

这在一定程度上是品味问题。 您可以选择在一个方法中一个一个地显示和隐藏控件,也可以将它们分组到一个 UserControl 中,然后在一个命令中显示或隐藏。

我会根据以下问题以一种或另一种方式做出决定:

  • 是否有始终可见的控件,这些控件的布局如何?

  • 有多少控件可以显示/隐藏?

  • 是否需要重复使用您的一个或多个视图?

最后一个问题可能会产生很大的不同:如果您想重用,请选择UserControl 。 它基本上就是这样做的:像表单一样对控件进行分组。

对于一些控件一个接一个(在 switchViewMode 方法中)就足够了,imo。

要添加 UC,您可以在项目资源管理器中右键单击您的项目并选择add - usercontrol 。 然后选择一个好听的名称,例如 UC_Goods 或 UC_Services 或您的商店政策建议的任何名称

然后您将看到空的 GUI。 现在添加您需要的控件。

这里需要做出一个决定:如果您要重用它,请确保控件获得通用名称! 如果没有也没关系。 原因是,当您添加同一个 UC 的两个实例时,它们的控件将具有相同的名称,并且您必须通过父级(UC)来限定它们

在这里,您还可以编写事件等脚本。

最后根据需要向 TabPage 添加实例,如下所示:

public UC_Goods uc_goodsDelivered = new UC_Goods();
public UC_Goods uc_goodsOnHold = new UC_Goods();
public UC_Services uc_ItServices = new UC_Services ();

public Form1()
{
  InitializeComponent();
  tab.tp_goodsPage.Controls.Add(uc_goodsDelivered);
  tab.tp_goodsPage.Controls.Add(uc_goodsOnHold);
  goodsOnHold.Hide();
  tab.tp_goodsPage.Controls.Add(uc_ItServices);
  uc_ItServices .Hide();
  // take care of dock style or anchors..
  // ..and initialzing fields..
}

这分别声明了两个 UC 类以及每个类的两个和一个实例。 只有一个是可见的。 由于一个类被使用两次,因此它的控件名称不明确,直到您限定它们,例如像这样: uc_goodsDelivered.Status ...

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何禁用TabControl内的选项卡?(How can I disable a tab inside a TabControl?)
    问题 有没有一种方法可以禁用TabControl中的选项卡? 回答1 TabPage类隐藏Enabled属性。 这是故意的,因为它存在一个尴尬的UI设计问题。 基本问题是,禁用页面不会同时禁用选项卡。 并且,如果尝试通过使用Selecting事件禁用选项卡来解决此问题,则当TabControl只有一页时,它将不起作用。 如果您不关心这些可用性问题,那么请记住,该属性仍然有效,它只是对IntelliSense隐藏。 如果FUD不舒服,则只需执行以下操作: public static void EnableTab(TabPage page, bool enable) { foreach (Control ctl in page.Controls) ctl.Enabled = enable; } 回答2 将您的TabPage强制转换为控件,然后将Enabled属性设置为false。 ((Control)this.tabPage).Enabled = false; 因此,选项卡页的标题仍将启用,但其内容将被禁用。 回答3 您可以简单地使用: tabPage.Enabled = false; 该属性未显示,但可以正常使用。 您可以在TabControler对Selecting事件进行编程,以使其无法更改为不可编辑的选项卡: private void tabControler
  • Changing and passing content inside tabControls tabPage
    I am working in windows forms application and have a following issue. I use tabControl in my application and there is a need to change a content inside certain tabPages when users perform specific actions. for example tabPage one contains a text area and a button, when user clicks button information inside a text area should be stored somehow, and that same tabPage should display new content e.g. more text areas, buttons etc, I assume it is easier to do by using views inside it, so one view can be hidden and another can be shown.
  • 在tabControl中隐藏和显示TabPages(Hiding and Showing TabPages in tabControl)
    问题 我正在尝试根据用户选择显示或隐藏选项卡。 如果用户选择性别为男性,则应显示“男性”选项卡中的男性表格,如果用户选择女性,则应在下一个选项卡“女性”中显示类似的下一个表格 我尝试使用 tabControl1.TabPages.Remove(...) 和 tabControl1.TabPages.Add(...) 它添加和删除了标签页,但是这样做也会使我对标签页的控件失去控制...我看不到它们。 这是什么问题? 回答1 您可以从TabControl.TabPages集合中删除选项卡页,并将其存储在列表中。 例如: private List<TabPage> hiddenPages = new List<TabPage>(); private void EnablePage(TabPage page, bool enable) { if (enable) { tabControl1.TabPages.Add(page); hiddenPages.Remove(page); } else { tabControl1.TabPages.Remove(page); hiddenPages.Add(page); } } protected override void OnFormClosed(FormClosedEventArgs e) { foreach (var page in
  • 如何从TabControl隐藏TabPage [重复](How to hide TabPage from TabControl [duplicate])
    问题 这个问题已经在这里有了答案: 在tabControl中隐藏和显示TabPages (19个答案) 5年前关闭。 如何在WinForms 2.0中从TabControl隐藏TabPage? 回答1 不,这不存在。 您必须删除该选项卡,然后在需要时重新添加它。 或使用其他(第三方)标签控件。 回答2 隐藏TabPage的代码段 private void HideTab1_Click(object sender, EventArgs e) { tabControl1.TabPages.Remove(tabPage1); } 用于显示TabPage的代码段 private void ShowTab1_Click(object sender, EventArgs e) { tabControl1.TabPages.Add(tabPage1); } 回答3 我意识到这个问题很旧,并且可以接受的答案很旧,但是... 至少在.NET 4.0中... 隐藏标签: tabControl.TabPages.Remove(tabPage); 放回去: tabControl.TabPages.Insert(index, tabPage); TabPages在此方面比Controls要好得多。 回答4 Tabpages上尚未实现Visiblity属性,并且也没有Insert方法。
  • 如何在TabControl中更改大小和图像(How to change size and image in TabControl)
    问题 我想在TabControl更改TabPage大小, 每个选项卡都应该在一行中而不滚动。 第二个问题是关于如何将文本更改为“图像”(请忽略绿线): 编辑。 我使用Winforms。 回答1 广告1。 无法将标签页的宽度调整为自动适应所需的宽度,因此您只需做一些数学即可实现此目的。 广告2。 首先,您必须创建一个ImageList对象,然后将其传递给TabControl : ImageList il = new ImageList(); il.Images.Add("your_graphics_name", Image.FromFile(@"C:\Graphics\example.png")); (...) yourTabControl.ImageList = il; 然后,您可以在标签页的图像列表中设置密钥,以设置特定图像: yourTabControl.TabPages.Add("title", "text", "your_graphics_name"); 回答2 选项卡的大小和布局在WinForms中受到严格控制。 当然,您可以更改字体和字体大小,这将对选项卡的大小产生隐式影响,但这并不是您想要的声音。 现在,显然Windows允许您调节最小的默认制表符宽度,但是您不能直接使用现成的WinForm控件来做到这一点。 本文介绍了如何:如何使WinForms
  • 复制标签控制标签(Copy TabControl Tab)
    问题 我在互联网上搜索了此内容,但找不到如何使用C#进行操作 我正在尝试做的是,这样,当我单击NewTab按钮时,将出现一个新选项卡,其中的控件与第一个选项卡上的控件相同。 我看到了一些有关如何向表单添加UserControl信息,但是C#没有这样的信息。 对于每个会说“发布您的代码”的人,我没有任何人,所以不用理会,我唯一的代码是程序的代码,不会对任何人有帮助。 回答1 编辑 我已经重写了使用反射的解决方案。 using System.Reflection; // your TabControl will be defined in your designer TabControl tc; // as will your original TabPage TabPage tpOld = tc.SelectedTab; TabPage tpNew = new TabPage(); foreach(Control c in tpOld.Controls) { Control cNew = (Control) Activator.CreateInstance(c.GetType()); PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(c); foreach (PropertyDescriptor entry
  • 具有关闭和添加按钮的TabControl(TabControl with Close and Add Button)
    问题 我正在尝试使选项卡控件具有“ x”(关闭按钮)和“ +”(新选项卡按钮)。 我找到了添加斧头按钮的解决方案,该标签现在如下所示: 但是我想添加一个+ ,现在黑色的圆圈在哪里。 我不知道如何,我尝试在最后一个标签的Paint事件上Paint ,如下所示: var p = tabs.TabPages[tabs.TabCount - 1]; p.Paint += new PaintEventHandler(tab_OnDrawPage); private void tab_OnDrawPage(object sender, PaintEventArgs e) { // e.ClipRectangle. e.Graphics.DrawString("+", new Font("verdana", 10, FontStyle.Bold), Brushes.Black, e.ClipRectangle.X + 10, e.ClipRectangle.Y + 10); } 但这并没有显示任何吸引。 我想这与我传递给DrawString()调用的位置有关,但我不知道要使用的位置。 我用+10画出了最后一个标签。 如何解决? 我自己没有做过任何自定义绘图,正在学习中。 回答1 作为选项,您可以添加一个额外的选项卡,其中显示一个添加图标 并检查用户何时单击该选项卡
  • 如何更改选项卡控件的名称(how to change the name of the tabcontrol)
    问题 我在 C# WinForms 应用程序中使用选项卡控件。 我想更改选项卡的标题。 默认情况下,它们是 tabPage1、tabPage2 等。 回答1 您可以在设计器中非常简单地更改它; 点击标签页内容中的空白区域,使用属性视图设置Text属性。 也通过代码通过: tabPage1.Text = @"Something Meaningful"; 其中tabPage1将是对您想要设置Text的任何TabPage的引用。 回答2 一种没有代码的懒惰方法: 选择选项卡控件 转到属性,使用F4执行此操作选择TabPages属性,使用F4执行此操作单击(Collection)之后的...。 编辑名称和tabPage关联的任何tabPage属性。 回答3 tabCtrl.TabPages[0].Text = "some text"; tabCtrl.TabPages[1].Text = "some other text";
  • 如何使TabPage的标题文本变为粗体?(How do I make a TabPage's title text bold?)
    问题 我在C#Windows应用程序中有一些tabControl。 它具有一些tabPages。 有谁知道如何使tabPage文本变为粗体..? 回答1 您需要处理TabControl的DrawItem事件以手动绘制标题。 注意:受影响的控件的DrawMode应该设置为TabDrawMode.OwnerDrawFixed 。 这是一个示例: private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) { Graphics g = e.Graphics; Brush _TextBrush; // Get the item from the collection. TabPage _TabPage = tabControl1.TabPages[e.Index]; // Get the real bounds for the tab rectangle. Rectangle _TabBounds = tabControl1.GetTabRect(e.Index); if (e.State == DrawItemState.Selected) { // Draw a different background color, and don't paint a focus rectangle. _TextBrush
  • 从右到左TabControl的TabPage的关闭按钮c#(Close button for TabPages of Right To Left TabControl c#)
    问题 我想向TabControl TabPages添加一个关闭按钮。 我尝试此代码,并且可以使用从左到右的TabControl正常工作: private Point _imageLocation = new Point(13, 5); private Point _imgHitArea = new Point(13, 2); this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; tabControl2.DrawItem += TabControl2_DrawItem; private void TabControl2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { try { Image img = new Bitmap(GestionP.Properties.Resources.Close); Rectangle r = e.Bounds; r = this.tabControl2.GetTabRect(e.Index); r.Offset(2, 2); Brush TitleBrush = new SolidBrush(Color.Black); Font f = this.Font
  • 我如何在WinForms选项卡控件中知道您要从哪个选项卡移动到哪个选项卡?(How do I tell which tab you are moving from/to in a WinForms tab control?)
    问题 我需要确定用户在切换标签时来自和前往哪个标签,并可能取消该切换。 我尝试了Deselecting,Deselected,Selecting,Selected事件,所有这些事件都显示e.TabPageIndex与sender.SelectedIndex相同。 我是否可以使用一个事件或属性,以便可以确定事件的两个方面,还是必须将某些事件与某些事件一起缓存,并在新事件中使用该值? 我试图避免处理Deselecting / Deselected事件,并缓存要在Selecting事件中使用的值。 我已经知道我可以做到这一点,所以我问是否有一种更清洁的方法,而无需这样做。 我在C#和VB中都尝试过,但结果相同(不足为奇)。 谢谢。 回答1 看起来任何一个事件参数都不会同时包含上一个和当前选项卡的详细信息,因此您需要处理几个事件以保持跟踪。 至少,您需要使用Deselected事件来存储对先前选择的选项卡的引用。 您始终可以向TabControl查询其当前选项卡。 要进一步扩展,还可以处理Selected事件以跟踪当前选项卡。 Option Strict On Option Explicit On Public Class Form1 Private PreviousTab As TabPage Private CurrentTab As TabPage Private Sub
  • 如何在C#Winforms中更改未使用的空格选项卡的背景颜色?(How to change the background color of unused space tab in C# winforms?)
    问题 前任 |Tab1|Tab2|Tab3| { } | | | | | | | | |_____________________| 我能够改变backcolor和forecolor的Tab ..但我想改变的是,颜色{} - >空的空间这是可能做到这一点。 ..它显示默认的winforms颜色..帮助我 private void Form1_Load(object sender, EventArgs e) { } private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { Font fntTab; Brush bshBack; Brush bshFore; if ( e.Index == this.tabControl1.SelectedIndex) { fntTab = new Font(e.Font, FontStyle.Bold); bshBack = new System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, SystemColors.Control, SystemColors.Control, System.Drawing.Drawing2D.LinearGradientMode
  • 获取跨线程操作无效[重复](Getting Cross-thread operation not valid [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: 跨线程操作无效:从创建该线程的线程以外的线程访问控件 public void CheckUnusedTabs(string strTabToRemove) { TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove]; tp.Controls.Remove(this); TaskBarRef.tabControl1.TabPages.Remove(tp); } 我正在尝试使用上述代码在Windows应用程序的tabcontrol中关闭选项卡,但遇到错误: 跨线程操作无效。 如何解决呢? 回答1 您只能从主线程对WinForm控件进行更改。 您需要检查控件上的InvokeRequired是否为true,然后根据需要调用该方法。 您可以执行以下操作使其生效: public void CheckUnusedTabs(string strTabToRemove) { if (TaskBarRef.tabControl1.InvokeRequired) { TaskBarRef.tabControl1.Invoke(new Action<string>(CheckUnusedTabs), strTabToRemove); return; } TabPage tp =
  • 使用多个视图构建C#.NET Windows应用程序(Building C# .NET windows application with multiple views)
    问题 我正在重写一个旧的应用程序,并以此为契机尝试C#和.NET开发(我通常在C中做很多插件工作)。 该应用程序基本上是一个收集数据的计时器。 它具有一个带有按钮的开始视图以开始测量。 在测量期间,根据用户想要查看的信息,该应用程序具有五个不同的视图。 在视图之间进行切换的最佳实践是什么? 从开始到运行? 在运行视图之间? 想法: 使用一种形式并隐藏和显示控件使用一个开始窗体,然后使用带有TabControl的窗体使用六种不同的形式 回答1 创建一堆重叠的面板是设计时的噩梦。 我建议对每个“视图”使用单独的选项卡上的选项卡控件,然后在运行时选择正确的选项卡。 您可以通过在表单的Load事件中添加如下所示的内容来避免显示选项卡标题: tabControl1.Top = tabControl1.Top - tabControl1.ItemSize.Height; tabControl1.Height = tabControl1.Height + tabControl1.ItemSize.Height; tabControl1.Region = new Region(new RectangleF(tabPage1.Left, tabPage1.Top, tabPage1.Width, tabPage1.Height + tabControl1.ItemSize.Height)); 回答2
  • TabControl and borders visual glitch
    I have these visual glitches on every tabControls when I am changing its tabPages BackColor and the BackColor of the form, as illustrated on the following images: At the top of the tabPage, there is an interior one-pixel white border. At the left of the tabPage, there is an interior three-pixels white border. At the bottom of the tabPage, there is an interior one-pixel white border and an exterior two-pixels white border. At the right of the tabPage, there is an interior one-pixel white border and an exterior two-pixels white border. Is there a way I can get rid of those white borders?
  • tabControl中的“关闭”按钮(Close button in tabControl)
    问题 有没有人可以告诉我如何在C#中使用tabControl在每个选项卡中添加关闭按钮? 我计划使用按钮图片替换我的标签中的[x]。 谢谢你 回答1 在不派生类的情况下,这是一个简洁的代码段:http://www.dotnetthoughts.net/implementing-close-button-in-tab-pages/ 将选项卡控件的DrawMode属性设置为OwnerDrawFixed。 此属性决定系统还是开发人员可以绘制字幕。 将代码添加到Tab控件的DrawItem事件中–将为绘制每个Tab页面而调用此事件。 //This code will render a "x" mark at the end of the Tab caption. e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4); e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4); e.DrawFocusRectangle(); 现在要执行关闭按钮操作
  • TabControl tab headings resize when changing font
    I have an application that changes the font of every control to SegoeUI when it is run in Vista. It works fine, except for headings of tabpages (the buttons to click when switching from one tab to another). Tab page headings do not grow vertically to accommodate a larger font size, they always remain the same height. Is there a property that will allow the TabControl to handle this? (I have tried AutoSizeMode, but it only deals with a tab's width) If not, what is the best way programmatically to resize the tabpage headings based on the font size?
  • 如何根据C#中TabControl-TabPages中的ProductType过滤显示的产品(How to filter displayed Products according to the its ProductType in TabControl- TabPages in C#)
    问题 我一直在 youtube 上关注这个教程,但被困在了这部分。 在这里,我必须根据产品类型在 TabControl 选项卡页面上动态显示我的数据库中的产品,但我似乎无法根据选项卡页面产品类型过滤产品,并且所有产品都显示在每个产品类型上,如下所示。 请参阅下面的数据库和应用程序屏幕截图,我们将不胜感激。 将产品类型显示为标签页的代码 private void CreateTabPages() { con.Open(); SqlDataAdapter sda = new SqlDataAdapter("SELECT DISTINCT ProductType, Description FROM TblProductType", con); DataTable dt = new DataTable(); sda.Fill(dt); foreach (DataRow dr in dt.Rows) { tabControl1.TabPages.Add(dr["ProductType"].ToString(),dr["Description"].ToString()); } //var tabID = (from DataRow dr in dt.Rows // select (Int32)dr["TabID"]).Distinct(); con.Close(); 更新代码以显示产品
  • 有没有一种方法可以在Winforms中为标签页的标签着色?(Is there a way to color tabs of a tabpage in winforms?)
    问题 我正在努力寻找一种在WinForms中为选项卡页的选项卡页头着色的方法。 有一些解决方案可以使用OnDrawItem事件为当前索引的标签OnDrawItem ,但是是否可以为所有标签着色以不同的颜色,从而使用户对于某些行为更加直观? 提前致谢。 回答1 是的,不需要任何win32代码。 您只需要将选项卡控件的DrawMode属性设置为'OwnerDrawFixed',然后处理选项卡控件的DrawItem事件。 以下代码显示了如何: private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) { // This event is called once for each tab button in your tab control // First paint the background with a color based on the current tab // e.Index is the index of the tab in the TabPages collection. switch (e.Index ) { case 0: e.Graphics.FillRectangle(new SolidBrush(Color.Red), e.Bounds); break; case 1: e
  • Close button for TabPages of Right To Left TabControl c#
    I want to add a close button to TabPages of a TabControl. I try this code and it works fine with a Left To Right TabControl: private Point _imageLocation = new Point(13, 5); private Point _imgHitArea = new Point(13, 2); this.tabControl2.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; tabControl2.DrawItem += TabControl2_DrawItem; private void TabControl2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { try { Image img = new Bitmap(GestionP.Properties.Resources.Close); Rectangle r = e.Bounds; r = this.tabControl2.GetTabRect(e.Index); r.Offset(2, 2); Brush