'C# dataGridView 화면 갱신 방지'에 해당되는 글 1건

728x90

MySQL 데이터 Update 를 하면서 화면 갱신 문제처리에 부딪쳤다. 현재 작업하는 화면을 거의 유지하면서 MySQL 데이터 Update 를 해야 한다.


데이터 업데이트후 MySQL 다시 조회(Select) 루틴으로 하면 매번 화면의 current cell 상태를 잃어버린다. 이러다보니 너무 번거롭고 귀찮다.


foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
    string uid = row.Cells[2].Value.ToString();
    MessageBox.Show("index :" + row.Index.ToString() + " uid : " + uid);
    dataGridView1.Rows.RemoveAt(row.Index);  // 셀 삭제
}


선택된 행만 셀삭제 처리를 해보니까 선택된 행은 모두 삭제되고 마지막 셀 바로 이전셀이 자동으로 현재의 셀로 선택된다.


int columnIndex = dataGridView1.CurrentCell.ColumnIndex;
int rowIndex = dataGridView1.CurrentCell.RowIndex;


CurrentCell 의 값을 가지고 작업해보면 항상 마지막에 선택된 셀의 값만 반환한다.

따라서 이건 원하는 결과를 만들어주지 못해서 패스.


FullRowSelect 로 하다보니 화면에서 보기가 별로 안좋다.

그래서 CellSelect 방식으로 테스트를 해봤다.


foreach (DataGridViewCell row in dataGridView1.SelectedCells)
{
    string uid = dataGridView1.Rows[row.RowIndex].Cells[2].Value.ToString();
    MessageBox.Show("index :" +
row.RowIndex.ToString()+ " uid : " + uid);
    dataGridView1.Rows.RemoveAt(
row.RowIndex);  // 셀 삭제
}


셀 단위이지만 선택된 셀의 RowIndex 를 구하면 원하는 행의 값을 얻어낼 수가 있다.


셀 단위로 선택하면 오류를 범하기 쉬운 문제를 방지하기 위해서 특정한 칼럼만 선택될 때 동작하도록 if 문을 추가했다.

foreach (DataGridViewCell row in dataGridView1.SelectedCells)
{
    if (row.ColumnIndex == 3)
    {
        string uid = dataGridView1.Rows[row.RowIndex].Cells[2].Value.ToString();
        dataGridView1.Rows.RemoveAt(row.RowIndex);  // 셀 삭제
    }
}


테스트를 해보고 나서 MySQL DB와 연결해서 작업을 했더니 완벽하게 원하는 결과가 나온다.

private void CheckedData(DataGridView dgv, int checkingcode)
{
    myConn = new MySqlConnection(GetConnectionString());
    if (myConn.State == ConnectionState.Closed)
    {
        myConn.Open();
    }

    try
    {
        foreach (DataGridViewCell row in dgv.SelectedCells)
        {
            if (row.ColumnIndex == 3)
            {
                string uid = dgv.Rows[row.RowIndex].Cells["uid"].Value.ToString();
                string content = dgv.Rows[row.RowIndex].Cells["content"].Value.ToString();

                if (content == null || content.Equals("")) { continue; }
                string strqry = string.Format("UPDATE data SET checkingcode={0}, content='{1}' Where uid ={2}", checkingcode, content.Trim(), uid);
                MySqlCommand cmd = new MySqlCommand(strqry, myConn);
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                dgv.Rows.RemoveAt(row.RowIndex);  // 셀 삭제
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (myConn.State == ConnectionState.Open)
        {
            myConn.Close();
        }
    }
}


블로그 이미지

Link2Me

,