win7 C# winForm編程 savefiledialog 不能彈出儲存表單

來源:互聯網
上載者:User

標籤:

public void ResMsg()
        {
            while (isRecMsg)
            {
                //準備一個數組 準備接收 服務端發來的資料
                byte[] msgRec = new byte[1024 * 1024 * 2];
                //接收服務端發來的資料,此方法也會阻斷當前線程,並返回接收的資料的長度
                int recLength = sokClient.Receive(msgRec);
                switch(msgRec[0])
                {
                    case 1://接收到 檔案
                        DialogResult reuslt = new SaveFileDialog().ShowDialog();   --- 此處有問題 
                        if (reuslt == System.Windows.Forms.DialogResult.OK)
                        {
                            using (FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create))
                            {
                                fs.Write(msgRec, 1, recLength - 1);
                            }
                            ShowMsg("檔案儲存完畢!" + saveFileDialog1.FileName);
                        }
                        break;
                    case 2://接收到 字串訊息
                        {
                            //將資料轉成字串(要轉換的數組,開始轉換的下標,要轉換的資料長度)
                            string strRec = System.Text.Encoding.Default.GetString(msgRec, 1, recLength-1);
                            //將接收到的資料顯示在文字框中
                            ShowMsg(strRec);
                            break;
                        }
                    case 3://接收到 閃屏命令
                        {
                            ShakeWindow();
                            break;
                        }
                }
            }
        }

用戶端和伺服器傳輸檔案時, 伺服器端都顯示發送成功了,但是到用戶端儲存時,savefiledialog 儲存對話方塊就是彈不來???

仔細的檢查代碼好幾遍,邏輯上沒有錯誤。就是彈不出來,很無語了。就上網查了,查了很多資料,沒有什麼頭緒。在查的過程中,我看見這樣的一句話“你前面都說了,你使用線程調用,那麼這個線程是否為主線程?如果不是主線程,那麼你應該把它交給主線程去處理”,然後我就用一個例子類比了一下,確實有關係。

類比的例子:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(saveDialog);
            t.IsBackground = true;
            //t.ApartmentState = ApartmentState.STA;//缺少這句話,就會出錯誤。

    //不過以上這句在Vs 2010中顯示是被微軟否決的,過時的,雖然還能用。但是為了更好的相容版本,微軟推出以下方法:

    t.SetApartmentState(ApartmentState.STA);  //即是線上程啟動時設定它的單元狀態,這裡設定它的狀態為單一執行緒 Apartment


            t.Start();
        }

        public void saveDialog()
        {
            SaveFileDialog result = new SaveFileDialog();
            result.ShowDialog();
        }
    }

  類比的例子:缺少這句話【t.ApartmentState = ApartmentState.STA】,就會出錯誤。但在vs2010中設定方式變為t.SetApartmentState(ApartmentState.STA);//即是線上程啟動時設定它的單元狀態,這裡設定它的狀態為單一執行緒 Apartment

同理  savefiledialog 儲存對話方塊就是彈不來???是不是也是這個問題啊?經過嘗試後,還真是這的問題。

就這麼簡簡單單的一句話,就花費了我兩個多小時,但最後解決了,也很高興,並且在找的過程中收穫了不少。這就是有失必有得吧!加油!!!

 

本文轉載至http://daociyiyou111.blog.163.com/blog/static/164701512201182104248626/

但經由本人做了些微修改。

win7 C# winForm編程 savefiledialog 不能彈出儲存表單

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.