第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 BackgroundWorker 從 UI 獲取信息,然后更新 UI

使用 BackgroundWorker 從 UI 獲取信息,然后更新 UI

C#
紅顏莎娜 2022-11-13 13:36:17
我DataGridView通過運行 SQL 查詢來填充BackgroundWorker. 如果我直接在按鈕事件處理程序中運行代碼,我的代碼將完美運行,但是當我放入DoWorkBackgroundWorker 時,它不會更新 UI。我的代碼如下。DataTable tab1table = new DataTable();public Form1(){    InitializeComponent();    Instantiatesearch1Thread();}private void Instantiatesearch1Thread(){    search1Thread.WorkerReportsProgress = true;    search1Thread.WorkerSupportsCancellation = true;    search1Thread.ProgressChanged += search1Thread_ProgressChanged;    search1Thread.DoWork += search1Thread_Dowrk;    search1Thread.RunWorkerCompleted += search1Thread_RunWorkerCompleted;}    private void sbutton1_Click(object sender, EventArgs e){    search1Thread.RunWorkerAsync();}void search1Thread_Dowrk(object sender, DoWorkEventArgs e){    int percentprogress = 0;    percentprogress++;    Thread.Sleep(1000);    // Search1 button event handler    using (SqlConnection conn = new SqlConnection(connectionstring))    {        conn.Open();        using (SqlDataAdapter cmd = new SqlDataAdapter(comboBox1SQL, conn))        {            if (comboBox1.Text.Contains("ID"))            {                long para = long.Parse(search1.Text);                cmd.SelectCommand.Parameters.Add(new SqlParameter                {                    ParameterName = "@combo1Par",                    Value = para,                    SqlDbType = SqlDbType.BigInt                });            }通過使用 aMessageBox我發(fā)現(xiàn)代碼沒有訪問if comboBox1.Text.Contains()語句,我認為這是有道理的,因為該信息來自 UI 并且BackgroundWorker不能直接訪問 UI。這也可以解釋為什么當時tab1datatable并tab1table沒有受到影響。我想我需要在Invoke某處使用該方法,但我不確定如何使用。我查看了c# - 在執(zhí)行期間將信息從 UI 傳遞給 BackgroundWorker,但它并沒有真正回答我的問題。如果Invoke是我需要的,我如何在此代碼中實現(xiàn)以允許它從 UI 獲取信息并隨后用填充的更新它DataGridView?
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻1848條經(jīng)驗 獲得超2個贊

這是您需要做的:


    private string search1_Text = "";

    private string comboBox1_Text = "";

    private void Instantiatesearch1Thread()

    {

        search1_Text = search1.Text;

        comboBox1_Text = comboBox1.Text;

        search1Thread.WorkerReportsProgress = true;

        search1Thread.WorkerSupportsCancellation = true;

        search1Thread.ProgressChanged += search1Thread_ProgressChanged;

        search1Thread.DoWork += search1Thread_Dowrk;

        search1Thread.RunWorkerCompleted += search1Thread_RunWorkerCompleted;

    }

在運行后臺工作程序之前,您基本上獲取了所需數(shù)據(jù)的副本。


然后您只需訪問DoWork代碼中的字段:


    void search1Thread_Dowrk(object sender, DoWorkEventArgs e)

    {

        int percentprogress = 0;

        percentprogress++;

        Thread.Sleep(1000);

        // Search1 button event handler

        using (SqlConnection conn = new SqlConnection(connectionstring))

        {

            conn.Open();

            using (SqlDataAdapter cmd = new SqlDataAdapter(comboBox1SQL, conn))

            {

                if (comboBox1_Text.Contains("ID"))

                {

                    long para = long.Parse(search1_Text);

                    cmd.SelectCommand.Parameters.Add(new SqlParameter

                    {

                        ParameterName = "@combo1Par",

                        Value = para,

                        SqlDbType = SqlDbType.BigInt

                    });

                }


                else if (comboBox1_Text.Contains("Other Thing") || comboBox1_Text.Contains("Other Stuff"))

                {

                    string para = search1_Text;

                    cmd.SelectCommand.Parameters.Add(new SqlParameter

                    {

                        ParameterName = "@combo1Par",

                        Value = "%" + para + "%",

                        SqlDbType = SqlDbType.NVarChar,

                    });

                }

                // Clear datatable if it contains any information and then fill it

                // tab1datatable is a DataGridView

                if (tab1table != null)

                    tab1table.Clear();

                cmd.Fill(tab1table);

                //tab1datatable.DataSource = tab1table;


                // A bunch of expensive calculations 

            }

        }

    }




查看完整回答
反對 回復 2022-11-13
?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

我不確定這是否是一個好的解決方案,但這可行。CheckForIllegalCrossThreadCalls初始化時設置為 false BackgroundWorker。


private void Instantiatesearch1Thread()

{

    // Initialize other stuff

    CheckForIllegalCrossThreadCalls = false;

}

并在任務完成后將其設置為 false。


private void search1Thread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

    // Do your work,

    CheckForIllegalCrossThreadCalls = true;

}


查看完整回答
反對 回復 2022-11-13
  • 2 回答
  • 0 關注
  • 99 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號