动态对话框

汤姆

我正在与我合作,Winforms我有一个关于使这些更具活力的问题。例如,我可以创建一个winform具有一组显示数据的文本框,但是我将如何使其动态化?就用户可以看到的文本框数量而言,取决于找到了哪些数据?

我知道我可以按照以下方式做一些事情:

TextBox tb = new TextBox();

在我的场景中,我有一个应用程序可以读取一堆文档,如果$找到 a,则会出现一个提示,要求用户输入正确的值,但是,如果文档有很多需要更新的值,那么这是很多的对话框。因此,解决此问题的一个好方法是让对话框出现在最后(在读取文件后),其中包含所有需要更新的值,并且用户可以一次更新所有这些值。

我看到的问题是需要显示的值的数量可以是从 1 到病房的任何值,这意味着循环需要考虑到这一点。

我目前的代码如下;

foreach (FileInfo fi in rgFiles)
{
    current++;
    fileProcessBar.Value = current / count * 60 + 40;

    string[] alllines = File.ReadAllLines(fi.FullName);

    for (int i = 0; i < alllines.Length; i++)
    {
        if (alllines[i].Contains("$"))
        {
            // prompt
            int dollarIndex = alllines[i].IndexOf("--");
            Regex regex = new Regex(@"(--.{1,100})");
            var chars = regex.Match(alllines[i]).ToString();

            string PromptText = chars.Replace("-", "");

            string promptValue = CreateInput.ShowDialog(PromptText, fi.FullName);

            if (promptValue.Equals(""))
            {

            }
            else
            {
                alllines[i] = alllines[i].Replace("$", promptValue);
                File.WriteAllLines(fi.FullName, alllines.ToArray());
            }
        }
    }

提示方法:

public static string ShowDialog(string text, string caption)
{
    Form prompt = new Form()
    {
        Width = 600,
        Height = 150,
        FormBorderStyle = FormBorderStyle.FixedDialog,
        Text = caption,
        StartPosition = FormStartPosition.CenterScreen
    };
    Label textLabel = new Label() { Left = 50, Top = 15, Width = 500, Text = text };
    TextBox textBox = new TextBox() { Left = 50, Top = 52, Width = 500 };
    Button confirmation = new Button() { Text = "Add", Left = 450, Width = 100, Top = 72, DialogResult = DialogResult.OK };
    confirmation.Click += (sender, e) => { prompt.Close(); };
    prompt.Controls.Add(textBox);
    prompt.Controls.Add(confirmation);
    prompt.Controls.Add(textLabel);
    prompt.AcceptButton = confirmation;
    prompt.MaximizeBox = false;


    return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : "";  
}

我的问题是如何winform在大小和显示内容方面更加动态?如何在不指定大小和位置的情况下创建新表单?但仍然不是一团糟?

Mong Zhu

制作一个特定大小的新表格。然后将FlowLayoutPanel添加到与表单几乎相同宽度和几乎相同高度的表单中。为您需要的按钮留出足够的空间:

在此处输入图片说明

在面板属性中设置的字段AutoSize为true,AutoSizeModeGrowAndShrink

在此处输入图片说明

不要忘记指定FlowDirection

this.panel.FlowDirection = FlowDirection.TopDown;

现在您只需要一个方法,将您的提示控件添加到 的控件中FlowLayoutPanel(它将以自动方式对它们进行排序):

public void AddToCanvas(string text)
{
    this.flowLayoutPanel1.Controls.Add(new Label() {Text = text});
    this.flowLayoutPanel1.Controls.Add(new TextBox());

    Resize();

}

还有一个调整大小的方法来调整表单以适应其中当前控件的数量:

public void Resize()
{
    Size s = new Size();
    s.Height = this.flowLayoutPanel1.Height + this.button_Accept.Height + 
        (this.flowLayoutPanel1.Controls.Count * 10) + y_offset;
    s.Width = this.flowLayoutPanel1.Width + 10;
    this.MaximumSize = s;
    this.Size = s;
}

有了这个输入:

随机文本
$ 姓名
$ 地址
随机文本
$ 年龄
随机文本
$ 行星
$ 大陆
随机文本
$ StarSystem

我得到以下结果:

在此处输入图片说明

编辑:

在读取一个文件的内容后(在循环遍历各行之前)创建一个变量:

DynamicPrompt dp = new DynamicPrompt("YourCaption");

for (int i = 0; i < alllines.Length; i++)
{
    if (alllines[i].Contains("$"))
    {

开始循环,如果你到达重要的线路呼叫

        dp.AddToCanvas(PromptText);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章