【问题标题】:What is the best approach to assign the visibility for multiple controls为多个控件分配可见性的最佳方法是什么
【发布时间】:2014-05-11 21:18:57
【问题描述】:

好的,所以我正在尝试清理我的代码,因为它是一团糟,我拥有的是 25 个富文本框,我想将它们的 .Visible 变量放入一个数组中,并让一个 for 语句通过并使每个 false这样文本框就不会显示我尝试过的内容没有用,我无法弄清楚我所拥有的是什么。

bool[] box =  new bool[25];

box[0] = richTextBox1.Visible;
box[1] = richTextBox2.Visible;
box[2] = richTextBox3.Visible;
box[3] = richTextBox4.Visible;
box[4] = richTextBox5.Visible;
box[5] = richTextBox6.Visible;
box[6] = richTextBox7.Visible;
box[7] = richTextBox8.Visible;
box[5] = richTextBox6.Visible;
box[6] = richTextBox7.Visible;
box[7] = richTextBox8.Visible;
box[8] = richTextBox9.Visible;
box[9] = richTextBox10.Visible;
box[10] = richTextBox11.Visible;
box[11] = richTextBox12.Visible;
box[12] = richTextBox13.Visible;
box[13] = richTextBox14.Visible;
box[14] = richTextBox15.Visible;
box[15] = richTextBox16.Visible;
box[16] = richTextBox17.Visible;
box[17] = richTextBox18.Visible;
box[18] = richTextBox19.Visible;
box[19] = richTextBox20.Visible;
box[20] = richTextBox21.Visible;
box[21] = richTextBox22.Visible;
box[22] = richTextBox23.Visible;
box[23] = richTextBox24.Visible;
box[24] = richTextBox25.Visible;

for(int y = 0; y <25; y++)
  {
    box[y] = false;
  }

【问题讨论】:

  • box[...] = richTextBoxx.Visible 的东西实际上并没有做任何事情。你只是在初始化一个数组,然后在你对它做一些事情之前重写整个内容......

标签: c# arrays boolean


【解决方案1】:

将所有控件放在一个 asp:Panel 中,然后更改 panel.visible = false.... 的可见性。为什么事情过于复杂?

【讨论】:

  • 为什么假设这是 ASP.NET?为什么不考虑不是所有的 RichTextBox 都可以放在同一个面板中的可能性呢?等等等等。
  • @ThorstenDittmar 为什么不考虑他们在单独的页面上?为什么不考虑它们是单独的组件?除此之外,尽管 C# 是一个 .Net 项目,所以这是一个合理的假设,在我看来,不值得投反对票。
  • 如果它们可以放在同一个面板中呢?
  • 如果它们可以放在同一个面板上,这将是一个解决方案。不过,对于 ASP.NET,没有 RichTextBox 控件。案件结案。
【解决方案2】:

有时你无法绕过它,所以将它放在一个单独的方法中并一次性分配它们

private void SetVisibilityForAllTextBoxesTo(bool isVisible)
{
    this.richTextBox1.Visible = 
    this.richTextBox2.Visible = 
    this.richTextBox3.Visible = 
    this.richTextBox4.Visible = 
    this.richTextBox5.Visible = 
    this.richTextBox6.Visible = 
    this.richTextBox7.Visible = 
    this.richTextBox8.Visible = 
    this.richTextBox6.Visible = 
    this.richTextBox7.Visible = 
    this.richTextBox8.Visible = 
    this.richTextBox9.Visible = 
    this.richTextBox10.Visible = 
    this.richTextBox11.Visible = 
    this.richTextBox12.Visible = 
    this.richTextBox13.Visible = 
    this.richTextBox14.Visible = 
    this.richTextBox15.Visible = 
    this.richTextBox16.Visible = 
    this.richTextBox17.Visible = 
    this.richTextBox18.Visible = 
    this.richTextBox19.Visible = 
    this.richTextBox20.Visible = 
    this.richTextBox21.Visible = 
    this.richTextBox22.Visible = 
    this.richTextBox23.Visible = 
    this.richTextBox24.Visible = 
    this.richTextBox25.Visible = isVisible;
}

【讨论】:

    【解决方案3】:

    您无法更改数组中的bool 并期望这会更改文本框的Visible 状态。

    您必须更改该属性。因此,您要么必须将这些控件存储在一个集合中,要么使用不同的方法:如果它们在同一个容器控件中(如 FormGroupBoxPanel 等),则可以使用 Enumerable.OfType

    例如:

    var allRichTextBoxes = this.Controls.OfType<RichTextBox>()
        .Where(txt => txt.Name.StartsWith("richTextBox"));
    foreach(var rtb in allRichTextBoxes)
        rtb.Visible = false;
    

    【讨论】:

    • 这假定表单上除了他想要操作的 25 个 RTB 之外没有其他 RTB。我已经考虑将 25 个 RTB 放在同一个表单上,但也许您应该更改您的查询,以便像 OP 在他的问题中所做的那样考虑名称。
    • @ThorstenDittmar:我已经编辑了我的答案,只选择那些以"richTextBox" 开头的答案,尽管这看起来几乎是任意的。但也许这有助于 OP 使用更有意义的东西。
    • 好吧,他可以将应该处理的 RTB 命名为与不应该处理的不同的前缀。好办法。我会接受你的回答:-)
    • @ThorstenDittmar 我得到所有这些的原因是我刚刚学习如何使用表单,所以我开始创建一个可以同时打开 25 个文件的记事本。
    【解决方案4】:

    布尔值是值类型,因此当你赋值时:

    box[0] = richTextBox1.Visible;
    

    您只是复制布尔值,这完全独立于对象(由richTextBox1 引用)并且更改为不同的布尔值只会更改数组的内容,没有指向对象的链接来更改其属性。

    最简单的方法 - 还有其他可能更适合但更复杂的方法 - 是将对象引用存储在数组中并直接设置属性:

    var boxes = new RichTextBox[...]
    boxes[0] = richTextBox1;
    ...
    
    for (int y = 0; y < boxes.Lengthl y++) {
      boxes[y].Visible = false;
    }
    

    【讨论】:

      【解决方案5】:

      我想,这就是你需要的:

      for(int y =0; y < box.Length; y++)
      {
          ((RichTextBox)this.FindControl("richTextBox" + (y+1).ToString()))
                            .Visible = box[y];
      }
      

      【讨论】:

        【解决方案6】:

        TextBox.Visible 是一个属性,因此返回一个。因此,您的 Boolean 数组也包含值。更改此值对您的文本框没有任何作用,因为它不再知道文本框的任何内容。

        在 C# 中无法存储对值的引用,因此请尝试以下操作:

        RichtTextBox[] box =  new RichTextBox[25];
        
        box[0] = richTextBox1;
        box[1] = richTextBox2;
        box[2] = richTextBox3;
        box[3] = richTextBox4;
        box[4] = richTextBox5;
        // ...
        
        for(int y = 0; y <25; y++)
        {
            box[y].Visible = false;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-15
          • 1970-01-01
          • 2020-11-21
          相关资源
          最近更新 更多