【问题标题】:C# Formatted Text Field That Supports Buttons (like Java JTextField)支持按钮的 C# 格式化文本字段(如 Java JTextField)
【发布时间】:2017-06-09 02:27:44
【问题描述】:

我有一个 Winforms C# 应用程序,它生成一个报告,该报告由大约一百条文本消息和可以对每条消息采取的一些操作组成。我想在表单中显示此报告,显示每条消息及其下方的一系列按钮。

在 Java 中,我会使用 JTextField 和包含普通文本元素和 JButtons 的文档,它既漂亮又活泼,而且效果很好。

谁能建议一种在 C# 中执行此操作的方法?还是我可以使用的控件?

我的第一次尝试是使用 Panel 并使用 Label 和 Button 控件手动填充它,但这创建起来非常慢(尽管一旦创建就可以了)。

提前致谢!

【问题讨论】:

  • 您的意思是在运行时创建速度很慢,还是在 Visual Studio 中设置起来很费力?
  • 如果您可以制作一个示例(图像/图片)您期望解决方案做什么,那就太好了。之后我可以调整答案以提供一些代码。

标签: c# winforms user-interface textbox controls


【解决方案1】:

C# Win-Forms 的工作方式与 Java 不同。 Win-Forms 没有类似 snap 的控件布局,而是由 Px 从 Top、Left、Right、Bottom 定位。

更多类似java的布局使用WPF,这有点复杂,但给你自动调整大小/位置的进步。

生成TextBoxesButtons等可以在相当好的时间内完成,您不需要在后台使用Panel或其他组件。默认情况下Win-Forms会创建一个Form,作为Parent对象可以承载所有controls(你可以直接添加项目到它)。

【讨论】:

    【解决方案2】:

    为了澄清我想要做的事情: 我在 WinForms 应用程序中有一个表单。我想在由文本和按钮组成的可滚动面板上显示此表单中动态过程的输出。

    我最初的内容是这样的(注意这是从记忆中输入的):

    public void displayOutput(List<Item> items) {
    
        //create panel to host dynamic content
        Panel panel = new Panel();
        form.Controls.Add(panel);
        panel.AutoScroll = true;
        panel.OnLayout += Do_Layout;
    
        //create UI controls for each report item
        foreach (Item item in items) {
    
            //create a label to display the item 
            Label l = new Label();
            l.Text = item.Messagel
            panel.Controls.Add(l);
    
            //create a button to perform the item action
            Button b = new Button();
            b.Text = "Do something";
            b.Click += ... delegate to perform the action
            panel.Controls.Add(b);
        }
    }
    
    public void Do_Layout(object sender, EventArgs args) {
        int y = 0;
        Panel panel = (Panel)sender;
        foreach (Control control in panel.Controls) {
    
            Size sz = control.GetPreferredSize();
            control.Bounds = new Rectangle(0, y, sz.Width, sz.Height);
            y += sz.Height;
        }
    }
    

    效果恰到好处,但在面板布局方面却非常缓慢。

    我发现解决问题的方法是在计算所有控件的边界时暂停面板的布局。只需添加对 SuspendLayout() 和 ResumeLayout() 的调用即可完全修复它。

    public void Do_Layout(object sender, EventArgs args) {
        int y = 0;
        Panel panel = (Panel)sender;
        panel.SuspendLayout();  ////////////<<<<< added this
    
        foreach (Control control in panel.Controls) {
    
            Size sz = control.GetPreferredSize();
            control.Bounds = new Rectangle(0, y, sz.Width, sz.Height);
            y += sz.Height;  
        }
    
        panel.ResumeLayout();  ////////////<<<<< added this
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多