这是我的菜单中的代码,单击时它会创建另一个表单的实例。
private void btn_AdminReg_Click(object sender, EventArgs e)
{
this.Hide();
Admin_Login login = new Admin_Login(1);
login.Show();
}
它传递一个参数来改变它采用的登录方式(同一个登录表单用于登录多个表单)
在下一个形式中,代码看起来像这样(数据是我定义的一个类。它具有连接字符串并从 db 获取数据并插入、更新、删除所有函数)
public partial class Admin_Login : MetroFramework.Forms.MetroForm
{
int separator; // this is used to separate different logins
public Admin_Login(int value)
{
InitializeComponent();
separator = value;
}
//------- Legend ---------
//if separator= 1 : AdminTerminal
//if separator= 2 : UpdatingTerminal
//if separator= 3 : View Registration
//if separator= 4 : Registration
//if separator= 5 : Reports
//if separator= 6 : Cancel Union
static string path = Path.GetFullPath(Environment.CurrentDirectory);
static string dataBaseName = "Trade_Union_Registration.mdf";
private void btn_Login_Click(object sender, EventArgs e)
{
if (separator == 1)
{
Data getTable = new Data();
DataTable table = getTable.GetData("select UserName,Password from SuperUser where UserName='" + txt_UserName.Text + "' and Password='" + txt_Password.Text + "'");
if (table.Rows.Count == 1)
{
this.Hide();
TerminalAdmin AdminTerminal = new TerminalAdmin();
AdminTerminal.Show();
}
else
{
MetroFramework.MetroMessageBox.Show(this, "Invalid Username/Password please check your Username and Password and try again.", "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Error);
txt_Password.Clear();
}
}
else if (separator == 2)
{
Data getTable = new Data();
DataTable table = getTable.GetData("select UserName,Password from Admin_Table where UserName='" + txt_UserName.Text + "' and Password='" + txt_Password.Text + "'");
if (table.Rows.Count == 1)
{
Data getter = new Data();
DataTable dt = getter.GetData("select UserID from Admin_Table where UserName='" + txt_UserName.Text + "'");
MessageBox.Show(dt.Rows[0][0].ToString());
this.Hide();
Updating form = new Updating(dt.Rows[0][0].ToString(), txt_UserName.Text);
form.Show();
}
当我运行此代码时,我的表单需要大量时间才能将一个表单加载到其他表单。如何解决这个问题?
首先,我必须同意你的方法(连接 SQL 查询,普通密码)对于除了最原始的学习示例之外的所有方法都是有问题的。但我将假设这只是一个这样的学习示例。
显示的任何内容都不会花费很长时间,但大部分代码都丢失了。我最好的猜测是,您正在构造函数和实际显示表单之间的某处执行一些数据库查询。在这种情况下,了解 Windows 窗体窗体的“生命周期”以及引发任何事件的顺序非常重要。不幸的是,我在查找类似 asp.net 页面的列表时遇到了问题。这是我能得到的最接近的:https : //docs.microsoft.com/en-us/dotnet/framework/winforms/order-of-events-in-windows-forms
如果有任何代码必须在表单首次显示后运行,请将其放入Form.Shown()事件中。这就是它存在的目的。
一般而言,您将需要某种形式的多任务处理才能使此类应用程序工作:数据库查询、网络操作以及在较小程度上的磁盘操作非常慢(与大多数其他代码可以执行的操作相比)。多任务/线程的任何方法都应该有效:BackgroundWorker、Threads、async...await 模式。
如果你不这样做,你只是锁定了 GUI 线程。对用户而言,这将是“无响应”消息,并且不会对任何鼠标操作做出反应。
我会:
几年前,我做了一个简单的 BackgroundWorker 示例。为此,必须删除一些诸如报告之类的内容,但总体而言,它仍应使您走上正确的轨道:
#region Primenumbers
private void btnPrimStart_Click(object sender, EventArgs e)
{
if (!bgwPrim.IsBusy)
{
//Prepare ProgressBar and Textbox
int temp = (int)nudPrim.Value;
pgbPrim.Maximum = temp;
tbPrim.Text = "";
//Start processing
bgwPrim.RunWorkerAsync(temp);
}
}
private void btnPrimCancel_Click(object sender, EventArgs e)
{
if (bgwPrim.IsBusy)
{
bgwPrim.CancelAsync();
}
}
private void bgwPrim_DoWork(object sender, DoWorkEventArgs e)
{
int highestToCheck = (int)e.Argument;
//Get a reference to the BackgroundWorker running this code
//for Progress Updates and Cancelation checking
BackgroundWorker thisWorker = (BackgroundWorker)sender;
//Create the list that stores the results and is returned by DoWork
List<int> Primes = new List<int>();
//Check all uneven numbers between 1 and whatever the user choose as upper limit
for(int PrimeCandidate=1; PrimeCandidate < highestToCheck; PrimeCandidate+=2)
{
//Report progress
thisWorker.ReportProgress(PrimeCandidate);
bool isNoPrime = false;
//Check if the Cancelation was requested during the last loop
if (thisWorker.CancellationPending)
{
//Tell the Backgroundworker you are canceling and exit the for-loop
e.Cancel = true;
break;
}
//Determin if this is a Prime Number
for (int j = 3; j < PrimeCandidate && !isNoPrime; j += 2)
{
if (PrimeCandidate % j == 0)
isNoPrime = true;
}
if (!isNoPrime)
Primes.Add(PrimeCandidate);
}
//Tell the progress bar you are finished
thisWorker.ReportProgress(highestToCheck);
//Save Return Value
e.Result = Primes.ToArray();
}
private void bgwPrim_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbPrim.Value = e.ProgressPercentage;
}
private void bgwPrim_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
pgbPrim.Value = pgbPrim.Maximum;
this.Refresh();
if (!e.Cancelled && e.Error == null)
{
//Show the Result
int[] Primes = (int[])e.Result;
StringBuilder sbOutput = new StringBuilder();
foreach (int Prim in Primes)
{
sbOutput.Append(Prim.ToString() + Environment.NewLine);
}
tbPrim.Text = sbOutput.ToString();
}
else
{
tbPrim.Text = "Operation canceled by user or Exception";
}
}
#endregion
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句