动态对话框

时间:2017-08-14 09:02:00

标签: c# winforms

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

我知道我可以按照以下方式做点什么:

TextBox tb = new TextBox();

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

我看到的问题是需要显示的值的数量可以是从病房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如何在尺寸和展示方面更具活力?如何在不指定大小和位置的情况下创建新表单?但仍然不是乱七八糟的混乱?

1 个答案:

答案 0 :(得分:1)

制作一个具有一定尺寸的新表格。然后在表格中添加FlowLayoutPanel,其宽度与表格几乎相同,高度几乎相同。为您需要的按钮留出足够的空间:

enter image description here

在面板属性中,将字段AutoSize设置为true,将AutoSizeMode设置为GrowAndShrink

enter image description here

不要忘记指定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;
}

使用此输入:

  

随机文字
  $姓名
  $地址
  随机文本
  $年龄
  随机文本
  $ Planet
  $ Continent
  随机文本
  $ StarSystem

我得到以下结果:

enter image description here

修改

在读完一个文件的内容之后创建一个变量(在循环之前):

DynamicPrompt dp = new DynamicPrompt("YourCaption");

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

启动循环,如果进入重要的线路呼叫

        dp.AddToCanvas(PromptText);