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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

C#
紅顏莎娜 2022-11-13 13:36:17
我DataGridView通過(guò)運(yùn)行 SQL 查詢來(lái)填充BackgroundWorker. 如果我直接在按鈕事件處理程序中運(yùn)行代碼,我的代碼將完美運(yùn)行,但是當(dāng)我放入DoWorkBackgroundWorker 時(shí),它不會(huì)更新 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                });            }通過(guò)使用 aMessageBox我發(fā)現(xiàn)代碼沒(méi)有訪問(wèn)if comboBox1.Text.Contains()語(yǔ)句,我認(rèn)為這是有道理的,因?yàn)樵撔畔?lái)自 UI 并且BackgroundWorker不能直接訪問(wèn) UI。這也可以解釋為什么當(dāng)時(shí)tab1datatable并tab1table沒(méi)有受到影響。我想我需要在Invoke某處使用該方法,但我不確定如何使用。我查看了c# - 在執(zhí)行期間將信息從 UI 傳遞給 BackgroundWorker,但它并沒(méi)有真正回答我的問(wèn)題。如果Invoke是我需要的,我如何在此代碼中實(shí)現(xiàn)以允許它從 UI 獲取信息并隨后用填充的更新它DataGridView?
查看完整描述

2 回答

?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個(gè)贊

這是您需要做的:


    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;

    }

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


然后您只需訪問(wèn)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 

            }

        }

    }




查看完整回答
反對(duì) 回復(fù) 2022-11-13
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

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


private void Instantiatesearch1Thread()

{

    // Initialize other stuff

    CheckForIllegalCrossThreadCalls = false;

}

并在任務(wù)完成后將其設(shè)置為 false。


private void search1Thread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

    // Do your work,

    CheckForIllegalCrossThreadCalls = true;

}


查看完整回答
反對(duì) 回復(fù) 2022-11-13
  • 2 回答
  • 0 關(guān)注
  • 109 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)