为什么我的DataGridview拒绝刷新?

B. *_*non 0 .net c# oracle datagridview dotconnect

我正在更新表格中的一行.表的一个子集显示在DataGridView中.当我更新行时,更改不会反映在DataGridView中.即使我在提交更改后调用DataGridView.Invalidate()和DataGridView.Refresh(),我也必须关闭应用程序,重新启动并重新运行查询,然后才能看到更改.

相关代码是:

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();
}
Run Code Online (Sandbox Code Playgroud)

更新:

基于霍尔的建议(我试图回复评论,但它似乎挂了):

好的,我现在有了这个:

        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();
Run Code Online (Sandbox Code Playgroud)

...它仍然工作相同 - 更新,但DataGridView不知道它,直到我重新启动应用程序.

Dav*_*all 5

究其原因Invalidate(),并Refresh()不会重新查询数据源是,他们打算只与事物的图形一边工作-他们都无效该控制的客户区和强制重绘,但问题是,底层控制认为什么事都没有在数据源中发生了变化,因为它依赖于数据源来告诉它何时发生.

你需要的是你DataSource能成为什么东西来告诉DataGridView正在发生什么,例如BindingList<T>a或a BindingSource,这两者都有订阅的ListChanged事件DataGridView.

我曾经想过,DataTable当它发生变化时,它也告知了电网但是我错了或者OracleDataTable是不同的.

应该解决的问题是引入一个BindingSource并将其作为数据源DataGridView.然后创建OracleDataTable绑定源的数据源.如果这不起作用,则可以ResetBindings()在绑定源上调用该方法.

BindingSource b = new BindingSource();
b.DataSource = oracleDataTable1;
dataGridView1.DataSource = b;
Run Code Online (Sandbox Code Playgroud)