2012-03-20 12 views
0

テーブルの行を更新しています。テーブルのサブセットがDataGridViewに表示されます。行を更新すると、その変更はDataGridViewに反映されません。変更をコミットした後に私は DataGridView.Invalidate()とDataGridView.Refresh()を呼び出していますが、変更が見られる前に、アプリケーションをシャットダウンして再起動して再実行する必要があります。私は、なぜ私のDataGridviewはリフレッシュを拒否しますか?

OK:

private void buttonUpdate_Click(object sender, EventArgs e) 
{ 
    const int TICKETID_COLUMN = 0; 

    String _ticketID = dataGridView1.CurrentRow.Cells[SOME_COLUMN].Value.ToString(); 

    UpdateRecord(_ticketID, textBoxTicketSource.Text, 
       textBoxAboutSomeID.Text, textBoxCategoryID.Text, textBoxContactEmail.Text); 
} 

private void UpdateRecord(string ATicketID, string ATicketSource, string 
    AAboutSomeID, string ACategoryID, string AContactID) 
{ 
    oracleConnection1.Open(); 
    OracleCommand ocmd = new OracleCommand(); 
    OracleTransaction ot; 
    // Start a local transaction 
    ot = oracleConnection1.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); 
    // Assign transaction object for a pending local transaction 
    ocmd.Transaction = ot; 
    ocmd.Connection = oracleConnection1; 
    try 
    { 
     ocmd.CommandText = @"UPDATE ABC.CONCERTTICKETS 
            SET TICKETSOURCE = :p_TICKETSOURCE, 
            ABOUTSOMEID = :p_ABOUTSOMEID, 
            CATEGORYID = :p_CATEGORYID, 
            CONTACTEMAIL = :p_CONTACTEMAIL 
            WHERE TICKETID = :p_TICKETID"; 
     ocmd.Parameters.Add("p_TICKETSOURCE", ATicketSource); 
     ocmd.Parameters.Add("p_ABOUTSOMEID", Convert.ToInt32(AAboutSOMEID)); 
     ocmd.Parameters.Add("p_CATEGORYID", Convert.ToInt32(ACategoryID)); 
     ocmd.Parameters.Add("p_CONTACTEMAIL", AContactID); 
     ocmd.Parameters.Add("p_TICKETID", ATicketID); 
     ocmd.ExecuteNonQuery(); 
     ot.Commit(); 

     Popul8TheGrid(); 

     dataGridView1.Invalidate(); 
     dataGridView1.Refresh(); 
    } 
    catch (Exception e) 
    { 
     ot.Rollback(); 
     throw; 
    } 
    finally 
    { 
     oracleConnection1.Close(); 
    } 
} 

private void Popul8TheGrid() 
{ 
    int iFromYear = dateTimePickerFrom.Value.Year; 
    int iFromMonth = dateTimePickerFrom.Value.Month; 
    int iFromDay = dateTimePickerFrom.Value.Day; 
    int iToYear = dateTimePickerTo.Value.Year; 
    int iToMonth = dateTimePickerTo.Value.Month; 
    int iToDay = dateTimePickerTo.Value.Day; 

    oracleCommand1.Parameters.Clear(); 
    oracleCommand1.Parameters.Add("iStartDate", new DateTime(iFromYear, iFromMonth, 
     iFromDay)); 
    oracleCommand1.Parameters.Add("iEndDate", new DateTime(iToYear, iToMonth, 
     iToDay)); 
    oracleCommand1.Parameters.Add("iCATEGORYID", 114); 
    // OracleRef is apparently like OracleDbType.RefCursor; 
    OracleRef or = new OracleRef("_or"); 
    oracleCommand1.Parameters.Add("cref", or); 

    oracleConnection1.Open(); 

    oracleDataAdapter1.SelectCommand = oracleCommand1; 
    oracleDataAdapter1.GetFillParameters(); 
    oracleDataAdapter1.Fill(oracleDataTable1); 
    dataGridView1.DataSource = oracleDataTable1; 

    oracleConnection1.Close(); 
} 

更新:

適切なコードがあるホールの提案に基づいて

は(私がコメントで応答しようとしたが、ハングのようです)

...これは同じですが、更新はできますが、DataGridV私はアプリを再起動するまでそれを知らない。

+0

だから、実際には、グリッドのデータソースは、その後、resetbindingsを、ヌルブランドの新しいのBindingSourceを毎回作成し、つま先のDataGridViewへのバインディングソースをバインドするように設定され、あなたのグリッドはまだ新しいデータが表示されません?非常に奇妙なことは、あなたが持っているステップが実際には過度のものであるため、コードで進行しています。これが動作するには、半分は必要ないはずです。あなたがデバッガを使いこなす場合、データテーブルには何が表示されますか?バインディング・ソースをクラス・レベルの変数にしてから、データ表を完全に再作成するのではなく更新するとどうなりますか? –

答えて

1

やってみてください。

dataGridView1.DataSource = null; 
dataGridView1.DataSource = oracleDataTable1; 
+0

試しました。まだ「リフレッシュ」しません –

+0

BeginTransactionセクションでやっていますか?それは通常私のために働く。これは似たような質問です:http://stackoverflow.com/questions/253843/simple-datagridview-refresh-question – SamFisher83

5

理由Invalidate()Refresh()データソースは、それらが、物事のグラフィック側でのみ動作するように設計されていることである再クエリしていない - 彼らは両方のコントロールのクライアント領域を無効再描画を強制しますが、問題は、元のコントロールがデータソースで何も変更されていないと思うということです。あなたが必要なもの

DataGridViewが加入するListChangedイベントがあり、どちらもBindingList<T>またはBindingSource、などの上に何が起こっているかDataGridViewを教えてくれるものにするために、あなたのDataSourceです。

私はDataTableが変わったときにもグリッドに通知したと思っていましたが、間違っていたかOracleDataTableが違います。

問題を解決するには、BindingSourceを導入し、これをDataGridViewのデータソースにする必要があります。次に、バインド元のデータソースをOracleDataTableにします。これが機能しない場合は、バインディングソースのResetBindings()メソッドを呼び出すことができます。

BindingSource b = new BindingSource(); 
b.DataSource = oracleDataTable1; 
dataGridView1.DataSource = b; 
+0

これは私のために働いた! –

-2
dataGridView1.DataSource = null; 
dataGridView1.DataBind(); 
dataGridView1.DataSource = oracleDataTable1; 
dataGridView1.DataBind(); 
+0

DataGridViewはDataBind()メソッドを持たない: 'System.Windows.Forms.DataGridView'には 'DataBind'の定義がなく、 'System.Windows.Forms'型の最初の引数を受け入れる拡張メソッド 'DataBind'はありません。 DataGridView 'が見つかりました(usingディレクティブまたはアセンブリ参照がありませんか?) –

+1

DataBindは、winforms DataGridViewではなく、Asp.Netグリッドコントロールからのメソッドです。 –

+0

'.Refresh()'や '.Update()'を試しましたか? – Leon

関連する問題