我正在与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
如何在尺寸和展示方面更具活力?如何在不指定大小和位置的情况下创建新表单?但仍然不是乱七八糟的混乱?
答案 0 :(得分:1)
制作一个具有一定尺寸的新表格。然后在表格中添加FlowLayoutPanel,其宽度与表格几乎相同,高度几乎相同。为您需要的按钮留出足够的空间:
在面板属性中,将字段AutoSize
设置为true,将AutoSizeMode
设置为GrowAndShrink
:
不要忘记指定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
我得到以下结果:
修改强>
在读完一个文件的内容之后创建一个变量(在循环之前):
DynamicPrompt dp = new DynamicPrompt("YourCaption");
for (int i = 0; i < alllines.Length; i++)
{
if (alllines[i].Contains("$"))
{
启动循环,如果进入重要的线路呼叫
dp.AddToCanvas(PromptText);