2013-11-22 4 views
1

내 문제는 다음과 같습니다. C# 응용 프로그램에 해당 텍스트 열과 텍스트 상자 및 콤보 상자가있는 DataGridview가 있습니다. 모든 열은 데이터베이스에서 데이터를 가져옵니다. 텍스트 상자는 읽기 전용입니다. 각 행에서 값을 요청할 때 마지막으로 선택한 구성 요소의 값 (예 : 텍스트 상자가 읽기 전용이므로 콤보 상자의 값)이 null로 표시됩니다.DataGridViewComboBoxCell에서 마지막으로 선택한 항목을 가져올 수 없습니다.

예 :

나는 10 개의 셀을 연속으로 가지고 있습니다. 콤보 박스는 7 번째, 8 번째 및 9 번째 인덱스에 있으며 0부터 6까지의 인덱스는 텍 섹스입니다. 제가 그들의 3을 선택하면 (도 7,도 8의 순서로, 9) 나 제

row.Cells[7].Value의 셀 값을 얻을 수없는 row.Cells[8].Value가 OK이고, OK이고, i가 선택하면 row.Cells[9].Valuenull

인 그들 중 두 사람은 처음 8 다음 7, 내가 7

row.Cells[8].Value가 정상의 셀 값을 얻을 수없는 말을하자 row.Cells[7].Valuenull

때입니다 하나의 항목 만 선택하면 9라고 말하고 셀 값을 다시 null로 가져옵니다.

결과적으로 마지막으로 선택된 DataGridViewComboBoxCell을 null로 가져옵니다.

누구든지 내 문제를 도와 줄 수 있습니까? 모든 도움에 감사드립니다. DataGridView 즉시 사용자의 변경 사항을 커밋하지 않고 행이 확인 된 후에 만 ​​(생각, 여기에 잘못 될 수있다) 때문에

 private void cmbVariable_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      ComboBox cmb = sender as ComboBox; 
      BringQuery(cmb.SelectedItem.ToString()); 
     } 

     private void BringQuery(string option) 
     { 
      SqlConnection conn = new SqlConnection("Server = 10.2.6.14; Database = TTS; uid = myuser; password = mypassword"); 
      DataTable dt1 = new DataTable(); 
      SqlCommand cmd1 = new SqlCommand("select Track_Number, Parking_Area, Mission_Number, Track_Info, Time, Direction, Explanation from Traffic_Run_Table where [email protected]", conn); 
      SqlCommand cmd2 = new SqlCommand("select * from Traffic_Track_Table", conn); 
      SqlCommand cmd3 = new SqlCommand("select * from Traffic_Driver order by Id_Number", conn); 

      SqlDataAdapter sda1 = new SqlDataAdapter(cmd1); 
      cmd1.Parameters.Add(new SqlParameter("myType", option)); 
      try 
      { 
       conn.Open(); 
       sda1.Fill(dt1); 
       dataGridView2.AutoGenerateColumns = false; 
       foreach (DataGridViewColumn col in dataGridView2.Columns) 
       { 
        col.DataPropertyName = col.Name; 
       } 
       dataGridView2.DataSource = dt1; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

      DataGridViewComboBoxColumn cmbCol1, cmbCol2, cmbCol3; 

      SqlDataAdapter sda2 = new SqlDataAdapter(cmd2); 
      DataTable dt2 = new DataTable(); 
      try 
      { 
       cmbCol1 = new DataGridViewComboBoxColumn(); 
       cmbCol1.HeaderText = "Track 1"; 
       cmbCol1.Name = "Track1"; 
       cmbCol1.DataPropertyName = cmbCol1.Name; 
       cmbCol1.ValueType = typeof(int); 
       cmbCol1.Width = 50; 


       cmbCol2 = new DataGridViewComboBoxColumn(); 
       cmbCol2.HeaderText = "Track 2"; 
       cmbCol2.Name = "Track2"; 
       cmbCol2.DataPropertyName = cmbCol2.Name; 
       cmbCol2.ValueType = typeof(int); 
       cmbCol2.Width = 50; 

       sda2.Fill(dt2); 
       dt2.Columns[0].ColumnName = "Track"; 
       foreach (DataRow dr in dt2.Rows) 
       { 
        cmbCol1.Items.Add(Convert.ToInt32(dr["Track"])); 
        cmbCol2.Items.Add(Convert.ToInt32(dr["Track"])); 
       } 
       dataGridView2.Columns.Add(cmbCol1); 
       dataGridView2.Columns.Add(cmbCol2); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

      SqlDataAdapter sda3 = new SqlDataAdapter(cmd3); 
      DataTable dt3 = new DataTable(); 
      try 
      { 
       cmbCol3 = new DataGridViewComboBoxColumn(); 
       cmbCol3.HeaderText = "Driver"; 
       cmbCol3.Name = "Driver"; 
       cmbCol3.DataPropertyName = cmbCol3.Name; 
       cmbCol3.ValueType = typeof(string); 
       cmbCol3.Width = 260; 

       sda3.Fill(dt3); 
       dt3.Columns[0].ColumnName = "Id"; 
       dt3.Columns[1].ColumnName = "Driver"; 
       dt3.Columns[2].ColumnName = "Mission"; 
       foreach (DataRow dr in dt3.Rows) 
       { 
        cmbCol3.Items.Add(Convert.ToString(dr["Id"]).Trim() + " - " + Convert.ToString(dr["Dirver"]).Trim() + " - " + Convert.ToString(dr["Mission"]).Trim()); 
       } 
       dataGridView2.Columns.Add(cmbCol3); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      conn.Close(); 
     } 

     public string CheckNull(object value, Type objType) 
     { 
      string retVal = string.Empty; 

      if (value == null || value.ToString() == " " || value.ToString() == "") 
      { 
       if (objType == typeof(int)) 
       { 
        retVal = "0"; 
       } 
       if (objType == typeof(string)) 
       { 
        retVal = "-"; 
       } 
      } 
      else 
      { 
       retVal = value.ToString(); 
      } 
      return retVal; 
     } 

     private void Save_Click(object sender, EventArgs e) 
     { 
      SqlConnection connForSave = new SqlConnection("Server = 10.2.6.14; Database = TTS; uid = myuser; password = mypassword"); 
      SqlCommand cmdForSave = new SqlCommand("insert into Traffic_Records values (@type, @trackNumber, @parkingArea, @missionNmb, @trackInfo, @time, @direction, @explanation, @track1, @track2, @driverId, @driverName, @driverMission, @date)", connForSave); 
      foreach (DataGridViewRow row in dataGridView2.Rows) 
      { 
       try 
       { 
        dataGridView2[7, row.Index].Selected = false; 
        dataGridView2[8, row.Index].Selected = false; 
        dataGridView2[9, row.Index].Selected = false; 

        connForSave.Open(); 
        cmdForSave.Parameters.AddWithValue("type", CheckNull(cmbVairable.SelectedItem.ToString(), typeof(string))); 
        cmdForSave.Parameters.AddWithValue("trackNumber", Convert.ToInt16(CheckNull(row.Cells[0].Value, typeof(int)))); 
        cmdForSave.Parameters.AddWithValue("parkingArea", CheckNull(row.Cells[1].Value, typeof(string))); 
        cmdForSave.Parameters.AddWithValue("missionNmb", Convert.ToInt16(CheckNull(row.Cells[2].Value, typeof(int)))); 
        cmdForSave.Parameters.AddWithValue("trackInfo", CheckNull(row.Cells[3].Value, typeof(string))); 
        cmdForSave.Parameters.AddWithValue("time", CheckNull(row.Cells[4].Value, typeof(string))); 
        cmdForSave.Parameters.AddWithValue("direction", CheckNull(row.Cells[5].Value, typeof(string))); 
        cmdForSave.Parameters.AddWithValue("explanation", CheckNull(row.Cells[6].Value, typeof(string))); 
        cmdForSave.Parameters.AddWithValue("track1", Convert.ToInt16(CheckNull(row.Cells[7].Value, typeof(int)))); 
        cmdForSave.Parameters.AddWithValue("track2", Convert.ToInt16(CheckNull(row.Cells[8].Value, typeof(int)))); 

        string[] sArray = null; 

        if (string.Compare(CheckNull(row.Cells[9].Value, typeof(string)), "0") != 0 && string.Compare(CheckNull(row.Cells[9].Value, typeof(string)), "-") != 0) 
        { 
         sArray = row.Cells[9].Value.ToString().Split('-'); 
         sArray[0] = sArray[0].Remove(sArray[0].Length - 2, 1); 
         sArray[1] = sArray[1].Remove(0, 1); 
         sArray[1] = sArray[1].Remove(sArray[1].Length - 2, 1); 
         sArray[2] = sArray[2].Remove(0, 1); 
        } 
        else 
        { 
         string temp = "0 - -"; 
         sArray = temp.Split(' '); 
        } 

        cmdForSave.Parameters.AddWithValue("driverId", Convert.ToInt16(sArray[0])); 
        cmdForSave.Parameters.AddWithValue("driverName", sArray[1]); 
        cmdForSave.Parameters.AddWithValue("driverMission", sArray[2]); 
        cmdForSave.Parameters.AddWithValue("date", DateTime.Now); 

        cmdForSave.ExecuteNonQuery(); 

        cmdForSave.Parameters.Clear(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message + "\n Line Number: " + ex.LineNumber()); 
       } 
       connForSave.Close(); 
      } 
     } 
+0

당신이 UR 코드를 게시 할 수 있습니다 ???. –

답변

0

이 발생합니다

여기 내 코드입니다. 따라서 마지막 값을 선택하고 행을 변경하지 않았으므로 유효성 검사 이벤트가 발생하지 않았으므로 콤보 상자의 값은 여전히 ​​null입니다.

이 당신의 그리드에 CurrentCellDirtyStateChanged (추가 정보를 원하시면 여기 MSDN 이벤트를 추가 해결하려면 :

private void GridCurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    dgvAssignedProperties.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

이 왜 새 값을 바로 최선을 다하고 있습니다

관련 문제