【问题标题】:Docking 2 rich text boxes对接2个富文本框
【发布时间】:2015-04-04 01:29:52
【问题描述】:

我正在尝试制作一个文本编辑器,我有 2 个富文本框。我使用第一个富文本框作为数字,并将其 Enabled 属性设置为 false。然后第二个文本框在它旁边

我目前已将第一个文本框的停靠栏设置为左侧,将第二个文本框的停靠栏设置为填充。但是第二个一直占据整个标签页?并且稍微向左靠近数字线,它隐藏在那里一点点。这是我创建的新文档 void 我有... T2 是数字行,T 是他们将输入的默认文本框。

TabPage t = new TabPage("new " + getNumber());
tabControl1.TabPages.Add(t);
tabControl1.SelectedTab = t;
RichTextBox T2 = new RichTextBox();
t.Controls.Add(T2);
T2.Dock = DockStyle.Left;
T2.Enabled = false;

RichTextBox T = new RichTextBox();
t.Controls.Add(T);
T.Dock = DockStyle.Fill;
T.Font = new Font("Microsoft San Serif", 11);
Random R = new Random();
int RandomNumberHere = R.Next(1000, 100000);
T.Text = "Welcome, type your text...";
T.Select();

【问题讨论】:

  • winforms,对吗?
  • 这个名字是真的吗?
  • Dock.Fill 填充。它没有填满其余的,而是填满了所有。要么使用锚点,要么编码你的调整大小事件。清楚你想要什么。你肯定没有告诉我们..
  • @TaW 这不是真的...Dock.Fill 填充可用空间减去其他停靠控件。你只需要一个特定的元素顺序(z-order)来实现你想要的。我认为这个问题非常具体,并且 OP 的做法是正确的(只是顺序不正确)。使用锚点或调整事件大小是错误的做法,如果之后表单发生变化,会造成极大的痛苦。
  • MSDN: 如果选择了填充,控件的所有四个边都会调整大小以匹配包含控件的边缘。 - 您的代码需要使用BringToFront,这很明显表明 cotrols 不是并排放置而是重叠,对于 RTB 几乎没有用,imo .. 而不是 OP 想要的。他还没有告诉我们的是:当用户调整容器大小时会发生什么,即:大小将如何变化??

标签: c#


【解决方案1】:

问题是您在控件列表的末尾定义了fill-docked 文本框... winforms 喜欢列表中的第一个填充停靠元素。

很容易解决:

RichTextBox T = new RichTextBox();
t.Controls.Add(T);
T.Dock = DockStyle.Fill;
T.Font = new Font("Microsoft San Serif", 11);
// Add this line
T.BringToFront();

或者你也可以做T2.SendToBack(); T被添加到控件集合之后。

或者您可以简单地创建(并添加到t.Controls),首先是填充停靠文本框,然后是左侧停靠文本框。

两种方法都可以

顺便说一下,尝试正确命名变量。 tTT2 不是好名字

【讨论】:

    【解决方案2】:

    给你:

    t.Controls.Add(T2);
    t.Controls.Add(T);
    
    t.Controls.SetChildIndex(T, 1);
    t.Controls.SetChildIndex(T2, 0);
    
    t.PerformLayout();  // needed after SetChildIndex!
    
    T2.Dock = DockStyle.Left;    
    T.Dock = DockStyle.Left;
    

    如果您希望您的盒子与 TabPage 一起增长,这是一种方法:

    private void t_Resize(object sender, EventArgs e)
    {
       // assuming you want the two RTBs to fill the TabPage
       // if you want something else, best add an anchored container panel
       // and use its resize event instead
       T2.Width = t.Width / 4;
       T.Width = t.Width / 4;
    }
    

    是的,t, T and T2 的名字真的很糟糕!

    【讨论】:

      【解决方案3】:

      发生了一些事情:

      Fill 就是这样做的;它填充整个 PARENT 控件。是否还有其他东西。

      在设置为启用之前,您的其他文本框将被隐藏。

      你可能会怎样?正在寻找的是一种根据正在创建的标签页的大小来设置文本框大小的方法:

          {
      
              TabPage t = new TabPage("new " + 1);
              tabControl1.TabPages.Add(t);
              tabControl1.SelectedTab = t;
              RichTextBox T2 = new RichTextBox();
              t.Controls.Add(T2);
              T2.Dock = DockStyle.Left;
              T2.Enabled = true ;
      
              RichTextBox T = new RichTextBox();
              t.Controls.Add(T);
              T2.Dock = DockStyle.Right;
              var AdjustedSize = T2.Size;
              AdjustedSize.Width = t.Size.Width * 2 / 3;
              T2.Size = AdjustedSize;
              T.Font = new Font("Microsoft San Serif", 11);
              Random R = new Random();
              int RandomNumberHere = R.Next(1000, 100000);
              T.Text = "Welcome, type your text...";
              T.Select();
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-08
        • 2016-05-06
        • 2015-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多