none
CellValueChanged 이벤트 e.RowIndex 질문 RRS feed

  • 질문

  • private void SalesGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
     {

          //MessageBox.Show(e.RowIndex.ToString()); <-- 데이터그리드뷰 로딩 후 실행하면 RowIndex 0 으로 표기됨 (아래코드 정상 동작)

           for (int i = 0; i <= e.RowIndex; i++)
           {
               if (SalesGV.Rows.Count >=0)
                {

                    ....

                }

           }

    }

    --[에러가 발생하는 경우]

    -- 위 코드와 동일한데 데이터그리드 뷰에서 검색을 하고 아래 CellValueChanged 발생하면

    private void SalesGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
     {

          //MessageBox.Show(e.RowIndex.ToString()); <-- 데이터그리드뷰 로딩 후 실행하면 RowIndex -1 으로 표기됨)

                                                                             <-- 무한루프 오류

           for (int i = 0; i <= e.RowIndex; i++)
           {
               if (SalesGV.Rows.Count >=0)
                {

                    ....

                }

           }

    }

    데이터 그리드 뷰에서 그리드만 로드된 경우는 아무 문제가 없습니다. RowIndex 0 부터 시작하는데 검색을 해서 데이터베이스에 값을

    가져와 데이터 그리드에 불러와 RowIndex 값을 확인하면 -1 부터 시작되네요..

    구현하고 싶은 부분은

    수량 * 단가 = 금액 즉 수량과 단가를 입력하면 금액이 자동 계산되도록 하려고 합니다.

    2018년 12월 24일 월요일 오전 8:33

모든 응답

  • 안녕하세요.

    위 코드만으로는 원인을 찾기가 좀 어려울것 같습니다.

    SalesGV_CellValueChanged 이벤트 생성 부분과

    SalesGV 그리드 뷰에 데이터를 바인딩하는 부분을 좀 봐야할것 같습니다.

    추가 정보를 주시면 검토해보도록 하겠습니다.

    수고하세요.

    2018년 12월 26일 수요일 오전 3:15
  • private
    void sales_Load(object sender, EventArgs e)

    {


    table.Columns.Add("프로젝트명",
    typeof(string));
    table.Columns.Add("수량",
    typeof(int));
    table.Columns.Add("단가",
    typeof(int));
    table.Columns.Add("금액",
    typeof(int));
    table.Columns.Add("부가세",
    typeof(int));
    table.Columns.Add("합계",
    typeof(int));

    this.SalesGV.DataSource = table;

    }

    페이지가
    처음 로드 될 때 (DB 값 없음) 수량 단가 등 계산이 되는데 CellValueChanged 로

    private
    void SalesGV_CellValueChanged(object sender, DataGridViewCellEventArgs
    e)
    {
    MessageBox.Show(e.RowIndex.ToString());
    int q = 0;
    int p =
    0;
    int v = 0;
    int t = 0;
    for (int i = 0; i <= e.RowIndex;
    i++)
    {
    if (e.RowIndex >= 0)
    {
    //수량
    if
    ((string)SalesGV.Rows[i].Cells[1].Value.ToString() ==
    "")
    {
    SalesGV.Rows[i].Cells[1].Value = 0;
    }
    else {
    p =
    Convert.ToInt32(SalesGV.Rows[i].Cells[1].Value);
    }

    //단가
    if
    ((string)SalesGV.Rows[i].Cells[2].Value.ToString() ==
    "")
    {
    SalesGV.Rows[i].Cells[2].Value = 0;
    }
    else
    {
    q =
    Convert.ToInt32(SalesGV.Rows[i].Cells[2].Value);
    }

    //금액
    if
    ((string)SalesGV.Rows[i].Cells[3].Value.ToString() ==
    "")
    {
    SalesGV.Rows[i].Cells[3].Value =
    0;
    }
    else
    {
    SalesGV.Rows[i].Cells[3].Value = q * p; <--이 부분에서 StackOverflow (무한루프)
    }

    //SalesGV.Rows[i].Cells[3].Value = q * p;

    //VAT
    if
    ((string)SalesGV.Rows[i].Cells[4].Value.ToString() ==
    "")
    {
    SalesGV.Rows[i].Cells[4].Value =
    0;
    }
    else
    {
    SalesGV.Rows[i].Cells[4].Value = Convert.ToInt32(((q *
    p) * 1.1) - (q * p));
    }
    //SalesGV.Rows[i].Cells[4].Value =
    v;

    //합계
    if ((string)SalesGV.Rows[i].Cells[5].Value.ToString() ==
    "")
    {
    SalesGV.Rows[i].Cells[5].Value =
    0;
    }
    else
    {
    SalesGV.Rows[i].Cells[5].Value = Convert.ToInt32((q * p)
    * 1.1);
    }
    //SalesGV.Rows[i].Cells[5].Value = t;
    }

    }

    DB를
    조회 한 후 수량, 단가를 변경하면 위 그림과 같이 무한루프에 걸려요...

    2018년 12월 26일 수요일 오전 7:30
  • 안녕하세요.
    아래에 올려주신 소스를 참고해서 확인해 보았습니다.

    일단, 결론부터 말씀드리자면,
    검색후에 데이터 바인딩 하는 부분에 문제가 있는것 같습니다.

    검색없이 샘플을 만들어서 단가값의 변경에 따른 금액 및 부과세, 합계의 변화가 이루어 지는지를 확인해보았습니다.

    <변경후>

    <또 변경후>

    소스는 아래의 주소에 올려두었습니다.
    참고로 확인해보세요.
    DataGridDataHandle

    추측되는 문제점으로는 검색하는 부분에 문제가 있는것으로 사료됩니다.
    초기 폼 로드시에 
    this.SalesGV.DataSource = table;

    데이터소스에 table 을 바인딩 해두셨는데, 이후에 어떤 방법으로 검색결과를 뿌려주었는지는 모르겠습니다만
    이부분을 확인해보시면 답이 보일것 같습니다.

    도움되시길 바랍니다.


    프로그램 개발에는 정답이 없다.

    2018년 12월 26일 수요일 오전 9:51
  • 먼저 답변 감사드립니다.

    페이지가 로드 될때 this.SalesGV.DataSource = table; 이 부분은

    그리드의 헤더 이름을 표시하기 위해 바이딩한 부분입니다.

    페이지가 로드 될때 헤더만 바인딩 된 경우는 CellValueChanged (위에 소스) 이 정상적으로 동작합니다.

    <수정을 목적으로 DB에서 데이터 검색>

    private void btnSearch_Click(object sender, EventArgs e)
      {

    adoCon = new SqlConnection(strConnectionString);
       adoCon.Open();

       cmd = new SqlCommand("ERP2_SALES_P_V1", adoCon);
       cmd.CommandType = CommandType.StoredProcedure;
       cmd.Parameters.AddWithValue("@PJTNO", this.txtPJTNO.Text.Trim());

       adoDa = new SqlDataAdapter();
       adoDa.SelectCommand = cmd;

       adoDs = new DataSet();
       adoDa.Fill(adoDs);

       SalesGV.DataSource = adoDs.Tables[0];

    }

    문제는 수정시 DB에서 정보를 그리드에 불어온 다음 CellValueChanged 이벤트를 발생시키면

    SalesGV.Rows[i].Cells[3].Value = q * p; < --이 부분에서 StackOverflow (무한루프)부분에서 에러가 발생합니다. (bool) 로 반복 이벤트가 발생하는 부분은 막아야 하는게 아닌가 생각되는데 어떻게 접근을 해야 할지 모르겠어요..

    2018년 12월 27일 목요일 오전 2:43