2016-03-22 3 views
0

...最初の実行時にOpenFileDialogの問題は、私は勝つ形式でOpenFileDialogでこの問題を抱えている

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); 
     } 
    } 

...すべてはokです... が、第2クリックで...プロセスをBTNしますループに行く.. OpenFileDialogが開いているが、白の合計である... enter image description here

私は処分リソースの問題だと思います..しかし、私はそれを解決する方法がわかりません。数回の試行後に

... ... @EDIT

...私はボタンInserisci >>が上CLIK後に問題があることに気づきました。 初めて実行しましたが、2回目にクリックすると... btnAllegato btnInserisciの後にループ処理があります。

enter image description here コードbtnInserisci:private int _IDRichiedente = -1; private string _data = String.Empty; private string _url = string.Empty;は、クラスのフィールドである

 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は、接続を作成し、クエリを実行して接続を切断する私個人のクラスです。 コード:

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; 

    } 
} 

}

申し訳ありませんが私の英語

+0

アプリケーションに 'GDI +'または 'Win32'のAPIコードがありますか? –

+0

Windowsフォームのみ... – rul3z

+0

program.csのメインの上に[STAThread]属性がありますか? –

答えて

-1

ためには 'を使用' ステートメントの外にそれを取ります。それが違いを行う場合だけで見る

using (OpenFileDialog openFileDialog1 = new OpenFileDialog()) 

OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

に変更します。もしそうなら、問題はその陳述書を破棄することである。

+0

私は違いはありません.. :( – rul3z

+0

OpenFileDialog自体ではないと言いますが、ローカルのファイルをコピーして差分があるかどうかを確認する人には同意します。ダイアログの後にすべてコメントアウトすることもできます。ボックスにファイル名を表示する)、ゆっくりとコメントを外すことができます。 –

+0

ローカルでは同じ問題があります 問題は(私の意見では).. Open Dialogの1つです...私はOKや他のものをクリックする可能性がないので... becaus e窓は完全な白です..ループに行く... – rul3z

-1

イオsuggerireiディPROVAREコジ:使用非SI utilizza詐欺ルダイアログ

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

これは英語の知識共有サイトです。ここのほとんどの人はイタリア語を話さないので、あなたが言っていることを理解できません。英語で答えてください。 – Bjorn

+0

イタリア語で申し訳ありませんが、イタリア語で質問されました。私の答えは「私はこれを試してみてください」です。 –

0

私はFile.Copyがハングアップするかもしれないと思います。 URLとして「c:¥filename.pdf」のようなローカルファイルパスを使用して同じコードを試してください。

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

これが正しく動作する場合、問題はNASへの接続にあります。

+0

実際にネットワークリソースに接続している可能性がありますが、 'File.Copy'そこに犯人であってはならない...それは同期しているので、ハングアップした場合、ボタンを再度クリックするオプションを与える前にハングするはずです。 – Jcl

+0

@ Jcl:私は同意します。私はこの最初の試みが大丈夫だったことを荒々しく推測しており、再試行すると接続が失われました。 – Bjorn

+0

はNASへの接続の問題ではありません。地元で私は同じ問題があります。 このプログラムでは、私はshowDialogモードで使用される2つの異なる形式のsamesコードを持っています... 1つは正常に実行されますが、これはループになります... 信じられないほど... – rul3z

0

この問題は、アプリケーションでシングルスレッドのアパートメントCOMモデルを使用していない場合によく発生します。

一般的には、WinFormsのために、Program.csであなたのMain方法で、あなたは、のようなもの[STAThread]属性を持っている必要があります:あなたはそれを持っていない場合

[STAThread] 
static void Main() 
... 

を、あなたは、あなたドン確信していますMTAが必要な場合は、そこに追加するだけです。

そうでなければ、私はこのユーティリティーコードを書いています(私は書いていないと思いますが、どこかからコピーしましたが、クレジットを与えることはできません、しばらく私の "winformsユーティリティークラス"

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(); 
    } 
} 

がそれを使用するには、変更:

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

の場合:

if ((new DialogInvoker(openFileDialog1)).Invoke() == DialogResult.OK) 
STAを使用して、新しいスレッドを作成し、そこにダイアログを呼び出し、共通のダイアログ、用3210
+0

!(http:// s14。 postimg.org/o3jqh4q4h/img_Thread.png)STAThreadは現在何があるかを理解するために...私はスレッドスレッドアプリケーションなどを知っています。 いずれにしても、私のプログラムには2つのOpenFileDialogがあります。... 1つはうまく動作しますが、これはループになります.. – rul3z

+0

今、私はそれを実現しました。関数 'btnAllegato_Click'は、いつでもクリックして良い状態で実行されます...しかし、このフォームの別のボタン(画像のInserisci >>)をクリックして実行するループ処理があります。 dbに照会します。最初の実行はOKです...しかし、私はループを持っているクエリの後にbtnAllegatoをクリックします。 [フォーム](http://postimg.org/image/q3bi4p9kz/)...ボタンのための私のコードInserisci [btnInserisci] (http://postimg.org/image/saoqrub55/) 私は理由を知りませんが、ループはdbへのクエリーがOKで、次にbtnAllegatoへクリックした後でしかありません。 – rul3z

+0

'QueryAssist 'が何であるかわかりません – Jcl

関連する問題