我想撰寫一個代碼,當在winforms中按下一個按鈕時,它會從指定的表單串列中彈出一個隨機表單。
指定串列中的表單包括Form1、Form2 和 Form3。 不得將其創建為指定形式以外的形式。
我現在使用的代碼使用switch()and作業if()。但是,在增加或減少Forms數量的時候,修改各種地方很麻煩。
我知道如何創建表格。
private void ChangeForm(object sender, EventArgs e)
{
var form = new Form1();
form.ShowDialog();
}
new我堅持的部分是,當我使用關鍵字指定要創建的表單時,我不確定該怎么做。
任何幫助,將不勝感激。
uj5u.com熱心網友回復:
我會考慮創建一個串列,Func<Form>然后從串列中隨機選擇以創建您的Form. a 的優點Func<Form>是您可以合并更復雜的初始化,而 a 的優點List<>是您可以在運行時動態添加更多Form工廠。
像這樣的東西:
private Random _random = new Random();
private List<Func<Form>> _formFactories = new List<Func<Form>>()
{
() => new Form2(),
() => new Form3()
{
Text = "My Caption",
},
() => new Form4(),
}
private void ChangeForm(object sender, EventArgs e)
{
var form = _formFactories[_random.Next(0, _formFactories.Count)].Invoke();
form.ShowDialog();
}
uj5u.com熱心網友回復:
這可以使用Activator.CreateInstance(Type type).
您只需為type引數創建一個單獨的值。
在欄位中創建物件的原因random是通過僅創建一次來確保隨機性。
public partial class Form1 : Form
{
private Random random = new Random();
public Form1()
{
InitializeComponent();
}
private void ShowDialogRandomForm(object sender, EventArgs e)
{
var formsType = CreateFormsType();
var randomNumber = random.Next(0, formsType.Length);
var randomFormType = formsType[randomNumber];
var randomForm = Activator.CreateInstance(randomFormType) as Form;
randomForm?.ShowDialog();
}
private Type[] CreateFormsType()
{
return new[] { typeof(Form1), typeof(Form2), typeof(Form3) };
}
}
如果要改變指定的表格串列,只需要修改CreateFormsType()方法即可。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489383.html
