如何减少从一种形式到另一种形式的加载时间

用户9005650

这是我的菜单中的代码,单击时它会创建另一个表单的实例。

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 因为它是一个很好的初学者学习多任务/线程的工具。
  • 仅使用按钮启动后台工作人员。不要在这些按钮后面放置实际的数据库访问代码。如果将 DB 访问代码放在按钮后面,则在 DB 访问完成或超时之前,表单无法响应。
  • 当 BackgroundWorker 完成时,将结果显示在屏幕上。对于具有数据库访问权限的进度报告,您无能为力。

几年前,我做了一个简单的 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何执行从一种形式到另一种形式的更新查询

来自分类Dev

如何将变量从一种 qt 形式传递到另一种形式的 qt 形式?

来自分类Dev

将信息从一种形式传递到另一种形式?

来自分类Dev

从一种形式的类继承到另一种形式的类

来自分类Dev

PHP从一种形式获取价值到另一种形式

来自分类Dev

使用从一种形式到另一种形式的公共空隙

来自分类Dev

如何将值从一种形式传递到另一种形式的动态创建的控件

来自分类Dev

提交时如何将值从一种形式传递到另一种形式?

来自分类Dev

我如何将公共变量从一种形式传递到另一种形式

来自分类Dev

如何将文本从一种形式同步到另一种形式?

来自分类Dev

如何在 MS Access 中反映/复制从一种形式到另一种形式的更改

来自分类Dev

将datagridview从一种形式传递到另一种c#

来自分类Dev

将值从一种模型传递到另一种模型的形式

来自分类Dev

如何将数据从一种形式传递到另一种套件脚本

来自分类Dev

将输入值从一种形式复制到另一种形式

来自分类Dev

在将字符串从一种形式传递到另一种形式时调用函数

来自分类Dev

在vb.net中将变量从一种形式传递到另一种形式

来自分类Dev

在文本框中输入从一种形式到另一种形式的DateTime值

来自分类Dev

单击按钮将值从一种形式传递到另一种形式

来自分类Dev

单击登录按钮从一种形式重定向到另一种形式

来自分类Dev

在PHP中将下拉选择列表的内容从一种形式传递到另一种形式

来自分类Dev

在C#中将面板从一种形式复制到另一种形式

来自分类Dev

将输入值从一种形式复制到另一种形式

来自分类Dev

将值从一种形式传递到另一种形式作为消费者参数

来自分类Dev

尝试从一种形式导航到另一种形式时发生异常

来自分类Dev

PHP,HTML需要从一种形式定向到另一种形式

来自分类Dev

空字符串在Winforms中从一种形式传递到另一种形式

来自分类Dev

WinForms-将值从一种形式传递到另一种形式

来自分类Dev

在PHP中将变量的值从一种形式传递到另一种形式

Related 相关文章

  1. 1

    如何执行从一种形式到另一种形式的更新查询

  2. 2

    如何将变量从一种 qt 形式传递到另一种形式的 qt 形式?

  3. 3

    将信息从一种形式传递到另一种形式?

  4. 4

    从一种形式的类继承到另一种形式的类

  5. 5

    PHP从一种形式获取价值到另一种形式

  6. 6

    使用从一种形式到另一种形式的公共空隙

  7. 7

    如何将值从一种形式传递到另一种形式的动态创建的控件

  8. 8

    提交时如何将值从一种形式传递到另一种形式?

  9. 9

    我如何将公共变量从一种形式传递到另一种形式

  10. 10

    如何将文本从一种形式同步到另一种形式?

  11. 11

    如何在 MS Access 中反映/复制从一种形式到另一种形式的更改

  12. 12

    将datagridview从一种形式传递到另一种c#

  13. 13

    将值从一种模型传递到另一种模型的形式

  14. 14

    如何将数据从一种形式传递到另一种套件脚本

  15. 15

    将输入值从一种形式复制到另一种形式

  16. 16

    在将字符串从一种形式传递到另一种形式时调用函数

  17. 17

    在vb.net中将变量从一种形式传递到另一种形式

  18. 18

    在文本框中输入从一种形式到另一种形式的DateTime值

  19. 19

    单击按钮将值从一种形式传递到另一种形式

  20. 20

    单击登录按钮从一种形式重定向到另一种形式

  21. 21

    在PHP中将下拉选择列表的内容从一种形式传递到另一种形式

  22. 22

    在C#中将面板从一种形式复制到另一种形式

  23. 23

    将输入值从一种形式复制到另一种形式

  24. 24

    将值从一种形式传递到另一种形式作为消费者参数

  25. 25

    尝试从一种形式导航到另一种形式时发生异常

  26. 26

    PHP,HTML需要从一种形式定向到另一种形式

  27. 27

    空字符串在Winforms中从一种形式传递到另一种形式

  28. 28

    WinForms-将值从一种形式传递到另一种形式

  29. 29

    在PHP中将变量的值从一种形式传递到另一种形式

热门标签

归档