c# Sql Server“加载窗口”

本文关键字:窗口 加载窗口 加载 Sql Server | 更新日期: 2023-09-27 18:06:07

这是我在这里的第一篇文章,但我经常使用这个网站来帮助我开发自己的应用程序,我应该说这个网站对我有很大的帮助,所以谢谢大家。

现在我的问题是:我正在开发我的第一个软件应用程序,在sql服务器和应用程序本身之间交换数据。它是用c#开发的。从sql server数据库保存或检索数据是没有问题的。我想要的是一种方法来通知用户本地机器(应用程序安装的地方)和服务器之间的延迟。我可以制作一些动画或简单地显示一些文本信息。我需要帮助的是如何创建激活/触发/运行的代码,当服务器通信时间正在运行。

如果你不能理解这个想法,想象一个电子游戏。当它加载时(在某些游戏中),你可以在游戏开始前看到加载屏幕。我需要一些代码,显示"加载窗口"时,应用程序下载或上传数据从/到服务器。

我将感谢任何代码示例或网站推荐。

p

c# Sql Server“加载窗口”

  • 如何在c#中实现进度条?

  • 如何在Visual c#中创建一个平滑的进度条

  • ProgressBar类

我已经开发了一个简单的PleaseWait类2年前,但我没有更新这个类,它工作得很好,有看希望这将给你一个想法来实现你的逻辑。

public partial class frmWait : Form
{
    public frmWait()
    {
        InitializeComponent();
    }
    bool _isMoving = false;
    int _moveStart_x = 0;
    int _moveStart_y = 0;

    private void tmrProgress_Tick(object sender, EventArgs e)
    {
        if (barProgress.Value == barProgress.Maximum)
            barProgress.Value = barProgress.Minimum;
        else
            barProgress.Value += 1;
    }
    private void btnCancel_Click(object sender, EventArgs e)
    {
        Close();
        PleaseWait.Abort();
    }
    protected override CreateParams CreateParams
    {
        get
        {
            System.Windows.Forms.CreateParams p = base.CreateParams;
            p.ClassStyle += 0x20000;
            p.ExStyle += 0x8000000;
            return p;
        }
    }
    protected override void WndProc(ref Message m)
    {
        const int WM_NCHITTEST = 132;
        base.WndProc(ref m);
        switch (m.Msg)
        {
            case WM_NCHITTEST:
                if (m.Result.ToInt32() == 1)
                    m.Result = new IntPtr(2);
                break;
        }
    }
    private void panelEx1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _isMoving = true;
            _moveStart_x = e.X;
            _moveStart_y = e.Y;
        }
    }
    private void panelEx1_MouseUp(object sender, MouseEventArgs e)
    {
        _isMoving = false;
    }
    private void pnlContainer_MouseMove(object sender, MouseEventArgs e)
    {
        if (_isMoving)
            this.Location = new Point(Location.X + e.X - _moveStart_x, Location.Y + e.Y - _moveStart_y);
    }
}
public class PleaseWait
{
    #region Static Operations
    private static Boolean _isAborted = false;
    private static Boolean _isVisible = false;
    private static frmWait _waitForm;
    private static String _waitingState = "";
    private static Boolean _autoClose = false;
    private static Boolean _cancelable = false;
    private static System.Threading.Thread _waiterThred;
    public delegate void CancelButtonPressed();
    public static event CancelButtonPressed OnCancel;
    public static Boolean AutoClose
    {
        get { return PleaseWait._autoClose; }
        set { PleaseWait._autoClose = value; }
    }
    public static string WaitingState
    {
        get { return PleaseWait._waitingState; }
        set { PleaseWait._waitingState = value; }
    }
    public static bool IsVisible
    {
        get { return _isVisible; }
        internal set { _isVisible = value; }
    }
    public static void ShowPleaseWait()
    {
        ShowPleaseWait("", _autoClose, false);
    }
    public static void ShowPleaseWait(string waitingState)
    {
        ShowPleaseWait(waitingState, _autoClose, false);
    }
    public static void ShowPleaseWait(bool autoClose)
    {
        ShowPleaseWait("", autoClose, false);
    }
    public static void ShowPleaseWait(string waitingState, bool autoClose, bool cancelable)
    {
        if (_waiterThred != null)
        {
            if (_isVisible)
            {
                // the please wait it woking, just continue and apply the changes
                _waitingState = waitingState;
                _autoClose = autoClose;
                _cancelable = cancelable;
                return;
            }
            else
            {
                _waiterThred.Abort();
                _waiterThred = null;
            }
        }
        _waitingState = waitingState;
        _autoClose = autoClose;
        _cancelable = cancelable;
        _isAborted = false;
        _isVisible = false;
        if (_autoClose)
            Application.Idle += new EventHandler(Application_Idle);

        _waiterThred = new System.Threading.Thread(DisplayWaitingForm);
        _waiterThred.IsBackground = true;
        _waiterThred.Name = "Please Wait....";
        _waiterThred.Start();
        Application.DoEvents();
    }
    public static void Abort()
    {
        _isAborted = true;
    }
    private static void Application_Idle(object sender, EventArgs e)
    {
        if (_autoClose)
            _isAborted = true;
    }

    private static void DisplayWaitingForm()
    {
        if (_waitForm != null)
        {
            if (!_waitForm.IsDisposed)
                _waitForm.Dispose();
            _waitForm = null;
            _isVisible = false;
        }
        try
        {
            if (_isAborted)
                return;
            _waitForm = new frmWait();
            if (_cancelable)
            {
                _waitForm.btnCancel.Enabled = true;
                _waitForm.btnCancel.Click += new EventHandler(btnCancel_Click);
            }
            try
            {
                _isVisible = true;
                _waitForm.Show();
                _waitForm.Focus();
                while (!_isAborted)
                {
                    System.Threading.Thread.Sleep(15);
                    _waitForm.lblMessage.Text = _waitingState;
                    Application.DoEvents();
                    _waitForm.lblMessage.Text = _waitingState;
                }
                _isVisible = false;
            }
            finally
            {
                FreeWaitingForm();
            }
        }
        finally
        {
            _isVisible = false;
        }
    }
    static void btnCancel_Click(object sender, EventArgs e)
    {
        if (_waitForm.InvokeRequired)
        {
            _waitForm.BeginInvoke(new EventHandler(btnCancel_Click), new object[] { e });
        }
        else
        {
            if (OnCancel != null)
                OnCancel.Invoke();
        }
    }
    private static void FreeWaitingForm()
    {
        _waitingState = "";
        _isVisible = false;
        if (_waitForm == null)
        {
            return;
        }
        _waitForm.Hide();
        if (!_waitForm.IsDisposed)
            _waitForm.Dispose();
        _waitForm = null;
    }
    #endregion
}

使用如下代码:

PleaseWait.ShowPleaseWait("Please wait", true, false);
// If second param is true then it will close the form automatically.
// If third param is true the it will expose a cancel button, so you can cancel your Asynchronous operations.

我没有插入设计代码,你可以通过查看代码来理解。

首先让我感谢您的回复。

Toby你的回答让我想到线程监控我的sql连接,但这有点棘手和混乱,因为应用程序仍在开发中,将使用更多的连接。

。阿曼尼的回答不完全是我想要的,但多亏了她,我找到了一个更简单的方法。我创建了一个表单(可以是其他任何东西),放置了一个标签说:保存到数据库,拿出了顶部栏,定义了位置,并定义了它的父显示时禁用,关闭时启用。下面的代码是我放入DataBaseInteractionClass

中的代码
private Wait myCustomWaitDialog = new Wait(); // My Waiting form
private void SaveToDatabase(myObjectToSave obj) // Method called to save data do DB
{
    // Create the connections and queries
    (...)
    // This is what I did
    // Show Waiting Form
    myCustomWaitDialog.Show();
    // Instanciate the command that will carry the query and to DB
    SqlCommand command = new SqlCommand(Queries.GetData(code), conn);
    // This is important
    //Create event that will fire when the command completes
    command.StatementCompleted += new StatementCompletedEventHandler(command_StatementCompleted);
    // Execute the transaction
    SqlDataReader reader = command.ExecuteReader();
    // Rest of the code (validations, close connections, try/catch, etc
    (...)
}
void command_StatementCompleted(object sender, StatementCompletedEventArgs e)
{
    // This is the method that closes my Waiting Dialog 
    myCustomWaitDialog.CloseDialog();
    myCustomWaitDialog.Dispose();
}

这还不是我想要的,但这是目前为止我找到的最好的解决方案。现在可以了:)无论如何,谢谢你的回复,我希望这能帮助到其他人。