2012-03-20 3 views
0

Я обновляю строку в таблице. Подмножество таблицы показано в DataGridView. Когда я обновляю строку, это изменение не отражается в DataGridView. Несмотря на то, что я вызываю DataGridView.Invalidate() и DataGridView.Refresh() после совершения изменения, я должен закрыть приложение, перезапустить и повторно запустить запрос до того, как можно будет увидеть изменение.Почему мой DataGridview не обновляется?

Соответствующий код:

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

Обновлено:

на основе внушения Холла (я попытался ответить с комментарием, но это, кажется, подвешенный):

OK, I У меня есть это сейчас:

 oracleDataAdapter1.SelectCommand = oracleCommand1; 
     oracleDataAdapter1.GetFillParameters(); 
     oracleDataAdapter1.Fill(oracleDataTable1); 
     // I don't see a "Clear" method or some such... 
     dataGridView1.DataSource = null; 
     //dataGridView1.DataSource = oracleDataTable1; 

     BindingSource b = new BindingSource(); 
     b.DataSource = oracleDataTable1; 
     dataGridView1.DataSource = b; 
     b.ResetBindings(false); 

     oracleConnection1.Close(); 

... и он по-прежнему работает так же - обновляется, но DataGridV iew не знает об этом, пока я не перезапущу приложение.

+0

Так что вы на самом деле установить DataSource сетки к нулю, создать новый BindingSource каждый раз, связать источник привязки к носке DataGridView, затем ResetBindings, и ваша сетка действительно до сих пор не показывают новые данные ? Что-то очень странное происходит с вашим кодом, так как действия, которые у вас есть, на самом деле чрезмерны - вам не нужно, чтобы половина из них работала. Что вы видите в datatable, если вы переходите к отладчику? И что произойдет, если вы возьмете источник привязки до переменной уровня класса, а затем просто обновите datatable, а не полностью воссоздаете его? –

ответ

1

Попробуйте сделать:

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

Пробовал; все еще не «обновляется» –

+0

Вы делаете это в разделе BeginTransaction? Обычно это работает для меня. Вот аналогичный вопрос: http://stackoverflow.com/questions/253843/simple-datagridview-refresh-question – SamFisher83

5

Причиной, побуждающей Invalidate() и Refresh() не повторным запросом источником данных является то, что они предназначены для работы только с графической стороной вещей - они оба аннулирование клиентской области элемента управления и заставить перерисовать, но проблема в том, что основной элемент управления считает, что в его источнике данных ничего не изменилось, поскольку он полагается на источник данных, чтобы рассказать об этом, когда это произойдет.

Что вам нужно, это ваш DataSource быть то, что будет говорить DataGridView, что происходит, например, как BindingList<T> или BindingSource, оба из которых имеют ListChanged события, о котором DataGridView при подписке.

Я думал, что 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» и никакого метода расширения «DataBind», принимающего первый аргумент типа «System.Windows.Forms». DataGridView '(вам не хватает директивы using или ссылки на сборку?) –

+1

DataBind - это метод из элемента управления gridview Asp.Net, а не winforms DataGridView. –

+0

Вы пытались использовать '.Refresh()' или '.Update()'? – Leon

Смежные вопросы