2016-03-22 11 views
0

.. ilk çalıştırma baştaOpenFileDialog sorunu i kazanmak şeklinde OpenFileDialog ile bu sorun var

private void btnAllegato_Click(object sender, EventArgs e) 
    { 

     try 
     { 

      using (OpenFileDialog openFileDialog1 = new OpenFileDialog()) 
      { 
       string path = string.Empty; 

       openFileDialog1.Title = "Seleziona richiestaIT (PDF).."; 
       openFileDialog1.Filter = ("PDF (.pdf)|*.pdf"); 
       openFileDialog1.FilterIndex = 1; 
       openFileDialog1.FileName = ""; 


       if (openFileDialog1.ShowDialog() == DialogResult.OK) 
       { 

        //salva l'intero path 
        path = openFileDialog1.FileName; 

        //nome file + estensione 
        string temp = openFileDialog1.SafeFileName; 

        //elimina l'estensione del file con IgnoreCase -> case Unsensitive 
        temp = Regex.Replace(temp, ".pdf", " ", RegexOptions.IgnoreCase); 

        //datatime + replace 
        string timenow = System.DateTime.Now.ToString(); 

        //replace data da gg//mm/aaaa ss:mm:hh -----> ad gg-mm-aaaa_ss-mm-hh 
        timenow = timenow.Replace(":", "-").Replace("/", "-");//.Replace(" ", " ");  

        //effettua una copia dal path origine alla cartella nel NAS 
        _url = @"\\192.168.5.7\dati\SGI\GESTIONE IT\RichiesteIT\" + temp + timenow + ".pdf"; 

        this.Cursor = Cursors.WaitCursor; 

        System.IO.File.Copy(path, _url); 


        this.Cursor = Cursors.Default; 
       } 


      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

... tüm ok ... Ama ikinci bir tıklama ile ... sürecini btn için döngüye git .. OpenFileDialog açık ama toplam beyaz ... enter image description here

Bence bu bir kaynak atma sorunudur .. ama nasıl çözeceğimi bilmiyorum.

... ... @EDIT birkaç denemeden sonra

... Sorunun ben Botton İsminizi girin >> üzerine clik sonra olduğunu fark etti. İlk kez iyi çalışıyorum ama btnInserisci i döngüsünde ikinci kez tıklattığımda ... btnAllegato.

enter image description here Kod btnInserisci: private int _IDRichiedente = -1; private string _data = String.Empty; private string _url = string.Empty; sınıfın bir alanları olduğunu

 private void btnInserisci_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      if ((_IDRichiedente != -1) && (_data != string.Empty) && (_url != string.Empty)) 
      { 
       //messageBox 
       MessageBox.Show(_url); 
       QueryAssist qa = new QueryAssist(); 
       string query = "INSERT INTO RICHIESTA_IT(ID_Risorsa, descrizione_richiesta, modulo_pdf, data_richiesta) VALUES('" + _IDRichiedente + "', '" + txtBreveDescrizione.Text + "', '" + _url + "', '" + _data + "');"; 
       MessageBox.Show(query); 

       qa.runQuery(query); 
       // qa.runQuery("INSERT INTO RICHIESTA_IT (ID_Risorsa, data_richiesta) VALUES ('" + _IDRichiedente + "','" + _data + "');"); 
      } 
      else 
      { 
       MessageBox.Show("Selezionare il richiedente,data o allegato!"); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

    } 

.

QueryAssist bir bağlantı oluşturan, bir sorguyu çalıştıran ve bağlantısını kesen kişisel sınıfımdır. Kodu:

class QueryAssist 
{ 
    System.Data.OleDb.OleDbConnection _OleDBconnection; 

    public QueryAssist() 
    { 
     this._OleDBconnection = null; 
    } 

    //riferimento di connessione al db 
    private bool connectionDB() 
    { 
     string connection = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=\"\\\\192.168.5.7\\dati\\Scambio\\Sviluppo\\Impostazioni temporanea db Censimento\\CensimentoIT.accdb\""; 
     try 
     { 
      _OleDBconnection = new System.Data.OleDb.OleDbConnection(connection); 
      _OleDBconnection.Open(); 
      return true; 

     } 
     catch(Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message); 
      return false; 
     } 
    } 

    private void disconnectDB() 
    { 
     try 
     { 
      _OleDBconnection.Close(); 
     } 
     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message); 

     } 
    } 

    public System.Data.DataTable runQuery(string query) 
    { 
     try 
     { 
      if (connectionDB()) 
      { 
       System.Data.DataTable dataTable = new System.Data.DataTable(); 
       System.Data.OleDb.OleDbCommand sqlQuery = new System.Data.OleDb.OleDbCommand(query, _OleDBconnection); 
       System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(sqlQuery); 
       adapter.Fill(dataTable); 
       disconnectDB(); 
       return dataTable; 
      } 
     } 
     catch(Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message); 
     } 
     return null; 

    } 

    public int countRowsQueryResult(string query) 
    { 
     try 
     { 
      if (connectionDB()) 
      { 
       System.Data.DataTable dataTable = new System.Data.DataTable(); 
       System.Data.OleDb.OleDbCommand sqlQuery = new System.Data.OleDb.OleDbCommand(query, _OleDBconnection); 
       System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(sqlQuery); 
       adapter.Fill(dataTable); 
       disconnectDB(); 
       return dataTable.Rows.Count; 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message); 
     } 
     return -1; 

    } 
} 

}

Maalesef ingilizcem

+0

Uygulamanızda herhangi bir GDI + 'veya' Win32' api kodu var mı? –

+0

sadece pencere formunda ... – rul3z

+0

Program.cs'inizin üzerinde [STAThread] özniteliğiniz var mı? –

cevap

-1

için 'kullanma' deyimi dışına götürün. bu bir fark yaratır mı diye bakın

using (OpenFileDialog openFileDialog1 = new OpenFileDialog()) 

OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

değiştirin. Eğer öyleyse, sorun ifadenin bertaraf edilmesi ile ilgilidir.

+0

Farkı olmadı .. :( – rul3z

+0

O zaman ben OpenFileDialog kendisi değil söyleyebilirim.Konus yerel denemek ve kopyalamak için denir ve bir differenc yapar görmek için söyleyen kişi ile aynı fikirde.İletişim tamamladıktan sonra her şeyi yorumlama deneyebilirsiniz (sadece bir mesaj koymak Dosya adını göstermek için kutu) ve yavaş yavaş bazı şeyler daha daraltmak kadar şeyler uncomment –

+0

Yerel olarak aynı sorun var. Sorun (benim görüşüme göre) .. Açık Dialog bir ... çünkü ok ya da başka bir şeyi tıklayamadım ... becaus e windows toplam beyaz .. döngüsüne ... – rul3z

-1

Io suggerirei di provare così: kullanma non si Utilizza con le iletişim

try 
{ 

    OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
    string path = string.Empty; 

    openFileDialog1.Title = "Seleziona richiestaIT (PDF).."; 
    openFileDialog1.Filter = ("PDF (.pdf)|*.pdf"); 
    openFileDialog1.FilterIndex = 1; 
    openFileDialog1.FileName = ""; 


    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 

     //salva l'intero path 
     path = openFileDialog1.FileName; 

     //Togli l'estensione dal file 
     string temp = Path.GetFileNameWithoutExtension(openFileDialog1.FileName); 

     //Crea un nome univoco usando data e ora 
     string timenow = System.DateTime.Now.ToString("dd-MM-yyyy_ss-mm-hh"); 


     //Crea il nome del file di destinazione 
     string _url = string.Format(@"\\192.168.5.7\dati\SGI\GESTIONE IT\RichiesteIT\{0}{1}.pdf", temp, timenow); 

     this.Cursor = Cursors.WaitCursor; 

     File.Copy(path, _url); 


     this.Cursor = Cursors.Default; 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

Bu bir İngilizce bilgi paylaşımı sitesidir. Buradaki çoğu insan İtalyanca bilmez, ve ne demek istediğini anlamayacaksın. Lütfen İngilizce cevap verin. – Bjorn

+0

İtalyanca hat için üzgünüm, ama soru bir italyanca tarafından yapıldı ve benim cevabım "Bunu denemenizi öneririm" :) –

0

Ben File.Copy asılı olabileceğini düşünüyorum. Aynı kodu, URL olarak "c: \ filename.pdf" gibi bir yerel dosya yolu ile deneyin.

//Crea il nome del file di destinazione 
string _url = string.Format(@"c:\{0}{1}.pdf", temp, timenow); 

Eğer bu doğru bir şekilde çalışıyorsa, sorun NAS'a olan bağlantı ile birlikte olacaktır.

+0

Bu gerçekten ağ kaynak bağlantısı olabilir ... ama 'File.Copy' Orada suçlu olmamalı ... o senkronize, bu yüzden asılırsa, düğmeye tekrar tıklama seçeneği bile vermeden önce asmak gerekir. – Jcl

+0

@Jcl: Katılıyorum. Çılgınca bu ilk denemeyi denedim tamam gitti ve yeniden denenirken bağlantı kayboldu. – Bjorn

+0

, NAS'a bağlantı sorunu değildir. Yerelde bende aynı problem var. Bu programda iki farklı formda (showDialog modu tarafından kullanılan) sames kodu var ... bir tanesi iyi ama bu döngüde ... inanılmaz ... – rul3z

0

Bu sorun, uygulamanızın tek bir iş parçacığı olan COM modelini kullanmadığı durumlarda yaygın olarak bulunur.Ondan var ve yoksa eminiz

[STAThread] 
static void Main() 
... 

Eğer don:

Genellikle WinForms için, Program.cs daki Main yöntemi, bir [STAThread] nitelik, bir şey gibi olması gerekir MTA'ya ihtiyacın var, sadece oraya ekleyebilirsiniz.

Aksi halde, bu yardımcı program kodum var (yazdığımdan emin değilim, sadece bir yerden kopyaladım ama gerçekten kredi veremiyorum, bir süredir "winforms yardımcı program sınıfında" var)

public class DialogInvoker 
{ 
    public CommonDialog InvokeDialog; 
    private Thread InvokeThread; 
    private DialogResult InvokeResult; 

    public DialogInvoker(CommonDialog dialog) 
    { 
     InvokeDialog = dialog; 
     InvokeThread = new Thread(new ThreadStart(InvokeMethod)); 
     InvokeThread.SetApartmentState(ApartmentState.STA); 
     InvokeResult = DialogResult.None; 
    } 

    public DialogResult Invoke() 
    { 
     InvokeThread.Start(); 
     InvokeThread.Join(); 
     return InvokeResult; 
    } 

    private void InvokeMethod() 
    { 
     InvokeResult = InvokeDialog.ShowDialog(); 
    } 
} 

kullanmak için, değişim:

if (openFileDialog1.ShowDialog() == DialogResult.OK) 

için:

if ((new DialogInvoker(openFileDialog1)).Invoke() == DialogResult.OK) 
STA kullanarak yeni iş parçacığı oluşturur ve orada iletişim çağırır ortak diyaloglar için
+0

! [Image] (http: // s14. postimg.org/o3jqh4q4h/img_Thread.png) İfadenin ne olduğunu anlayabilmek için ... ... iş parçacığı olduğunu biliyorum. Her durumda programımda iki OpenFileDialog var .. sames kodu ile .. Bir koşmak iyi ama bu ... döngüye git .. – rul3z

+0

şimdi farkettim ki ... 'btnAllegato_Click' işlevini tıklattığımda her zaman ve iyi çalışır ... Ama bu formda başka bir düğmeye (Inserisci >> resim) tıkladığımda döngü süreci var. db sorgusu İlk koşum tamam ... Ama btnAllegato'ya tıkladıktan sonra bir döngü var .. [form] (http://postimg.org/image/q3bi4p9kz/) ... Düğme kodum Inserisci [btnInserisci] (http://postimg.org/image/saoqrub55/) Neden olduğunu bilmiyorum ama döngü sadece db'ye sorulduktan sonra tamam ve sonra btnAllegato'ya tıklıyorum .. – rul3z

+0

"QueryAssist" in ne olduğunu bilmiyorum – Jcl