2009-06-26 3 views
0

강력하게 형식화 된 데이터 집합 테이블을 datagridview로 가져오고 있습니다. ID 대신 이름으로 외래 키를 선택할 수 있도록 콤보 상자 열을 추가합니다. 아마도 이것을하는 더 쉬운 방법이있을 것입니다.내 datagridviewcolumn이 지금 변경 사항을 승인하지 않는 이유는 무엇입니까?

강하게 입력 된 데이터 세트 테이블 유형으로 데이터 소스를 다시 캐스팅 할 수있는 동안 typeID 열을 comboboxcolumn으로 변환 할 수 있습니까? 데이터 소스에서 다시 가져와야합니까, 아니면 datagridview의 변경 사항이 자동으로 데이터 세트로 전달됩니까?

이 코드의 잘못된 점은 무엇입니까?

FormDg fDg; 
    internal DsTech.TechObjectsDataTable ShowDg(IWin32Window owner, Db db) 
    { 
     fDg = new FormDg(); 

     fDg._dg.DataSource = db.getDs().TechObjects; 
     var TypeSelecter = new DataGridViewComboBoxColumn(); 
     var types = db.getdsObjectTypes(); 
     TypeSelecter.DataSource = types; 
     TypeSelecter.DisplayMember = "type"; 
     TypeSelecter.Name = "Types"; 
     TypeSelecter.ValueMember = "ID"; 
     fDg._dg.Columns["typeID"].DisplayIndex=fDg._dg.Columns.Count-1; 
     fDg._dg.Columns.Add(TypeSelecter); 
     fDg._dg.ReadOnly = false; 
     Application.DoEvents(); 
     for (int i = 0; i < fDg._dg.RowCount; i++) 
     { 
      if ((fDg._dg.Rows[i].Cells["typeID"].Value is DBNull) == false) 
       //Line below does not work 
       UpdateTypesRow(i,(int)fDg._dg.Rows[i].Cells["typeID"].Value); 
     } 
     fDg._dg.CellEndEdit += new DataGridViewCellEventHandler(_dg_CellEndEdit); 


     if (fDg.ShowDialog(owner) == DialogResult.OK) 
     { 
      return (DsTech.TechObjectsDataTable)fDg._dg.DataSource; 
     } 
     else return null; 

    } 

이 코드는

void _dg_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     if (fDg._dg.Columns[e.ColumnIndex].Name == "Types") 
     { 
      fDg._dg.Rows[e.RowIndex].Cells["typeID"].Value = fDg._dg.Rows[e.RowIndex].Cells["Types"].Value; 
      //update typeID column 

     } 
     else if (fDg._dg.Columns[e.ColumnIndex].Name == "typeID") 
     { 
      //update types column 
      UpdateTypesRow(e.RowIndex,(int) fDg._dg.Rows[e.RowIndex].Cells["typeID"].Value); 
     } 
    } 

여기 난 그냥 경우에 내가 잘못 읽고 있던에 2를 ​​고려 코드 그냥 잘 작동하고 그들이 vbforums을 사용하여 실제로

void UpdateTypesRow(int rowIndex, int value) 
    { 
     fDg._dg.Rows[rowIndex].Cells["Types"].Value = value; 
    } 

답변

0

다른 있었지만. com 바인딩 소스를 사용하여 예제를 발견하고 datagridview의 데이터 소스 속성을 설정하기 전에 콤보 상자를 추가해야하며이 작업을 수행 할 수있었습니다. The Thread and code in c#