Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持按钮的C#格式文本字段(如Java JTextField)_C#_Winforms_User Interface_Textbox_Controls - Fatal编程技术网

支持按钮的C#格式文本字段(如Java JTextField)

支持按钮的C#格式文本字段(如Java JTextField),c#,winforms,user-interface,textbox,controls,C#,Winforms,User Interface,Textbox,Controls,我有一个Winforms C#应用程序,它生成一个由大约100条文本消息和对每条消息可以采取的一些操作组成的报告。我想以表单的形式显示此报告,显示每条消息及其下方的一系列按钮 在Java中,我会在包含普通文本元素和JButtons的文档中使用一个JTextField,这很好、很简洁,并且工作得很好 有谁能建议一种在C#中实现这一点的方法吗?还是我可以使用的控件 我的第一次尝试是使用一个面板并手动填充标签和按钮控件,但创建速度非常慢(尽管创建后就可以了) 提前谢谢 与Java相比,C#Win表单的

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

在Java中,我会在包含普通文本元素和JButtons的文档中使用一个JTextField,这很好、很简洁,并且工作得很好

有谁能建议一种在C#中实现这一点的方法吗?还是我可以使用的控件

我的第一次尝试是使用一个面板并手动填充标签和按钮控件,但创建速度非常慢(尽管创建后就可以了)

提前谢谢

与Java相比,C#Win表单的工作方式有所不同。Win表单没有快照式控件布局,而是由Px从上、左、右、下进行定位

更像java的布局是使用WPF,这有点复杂,但它提供了自动调整大小/位置的优势


生成
文本框
按钮
等可以在相当长的时间内完成,您不需要在后台使用
面板
或其他组件。默认情况下,Win-
表单
将创建一个
表单
,作为父对象,它可以承载所有
控件
(您可以直接将项目添加到其中)。

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

我最初的想法是这样的(注意,这只是从内存中输入的):

public void显示输出(列表项){
//“创建”面板以承载动态内容
面板=新面板();
窗体.控件.添加(面板);
panel.AutoScroll=true;
panel.OnLayout+=Do_布局;
//为每个报表项创建UI控件
foreach(项目中的项目){
//创建标签以显示项目
标签l=新标签();
l、 Text=item.Messagel
面板.控件.添加(l);
//创建一个按钮以执行项操作
按钮b=新按钮();
b、 Text=“做某事”;
b、 单击+=…委派以执行操作
控制面板。添加(b);
}
}
公共void Do_布局(对象发送器、事件args args){
int y=0;
面板=(面板)发送器;
foreach(面板中的控件。控件){
Size sz=control.GetPreferredSize();
control.Bounds=新矩形(0,y,sz.Width,sz.Height);
y+=深浅高度;
}
}
它工作得恰到好处,但在面板的布局上却非常缓慢

我发现解决问题的方法是在计算所有控件的边界时暂停面板的布局。只需添加对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
}
public void Do_布局(对象发送方、事件args args){
int y=0;
面板=(面板)发送器;

panel.SuspendLayout();//您的意思是运行时创建速度慢,还是在Visual Studio中设置起来费力?如果您能为解决方案提供一个示例(图像/图片),这将是一件非常好的事情。我可以调整答案,以便在之后提供一些代码。
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
}