2016-06-17 3 views
1

DataGridview C#에서 자동 완성 셀을 만들고 싶습니다. 그리고 나는 텍스트가 바뀔 때 자동으로 채워지는 autocompletecustomsource를 원한다.DataGridview 셀에 textchange 이벤트 추가

"How to get the text from current cell in datagridview textchanged event?"에 제안 된대로 textChanged 이벤트 처리기를 셀에 추가하려고했습니다. 그것은 작동합니다. 하지만 일부는 추락 시간 표시 오류

Vschost32 Error, or memory access violation. 

어떤 아이디어는 어떻게을 실현하려 ?

업데이트 1

내 코드

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     DataGridView dgv = sender as DataGridView; 
     string headerText = dgv.Columns[dgv.CurrentCell.ColumnIndex].HeaderText.ToString(); 
     DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl; 
     removeAutoComplete(tb); 
     if (headerText == "Kode Barang" && tb !=null) 
     { 
      tb.TextChanged += new EventHandler(tb_kodeBarang_TextChanged); 
     } 
     else if(headerText == "Nama Barang" && tb!=null) 
     { 
      tb.TextChanged += new EventHandler(tb_namaBarang_TextChanged); 
     } 
    } 
    private void removeAutoComplete(TextBox tb) 
    { 
     tb.TextChanged -= tb_kodeBarang_TextChanged; 
     tb.TextChanged -= tb_namaBarang_TextChanged; 
     tb.AutoCompleteMode = AutoCompleteMode.None; 
    } 
    private void tb_kodeBarang_TextChanged(object sender,EventArgs e) 
    { 
     TextBox tb = sender as TextBox; 
     if (tb.Text.Length > 0 && tb.Text != "" && tb.Text != null) 
     { 
      tb.AutoCompleteMode = AutoCompleteMode.Suggest; 
      tb.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      tb.AutoCompleteCustomSource = getStringCollection(tb.Text,"Kode");     
     } 
    } 
    private void tb_namaBarang_TextChanged(object sender, EventArgs e) 
    { 
     TextBox tb = sender as TextBox; 
     if (tb.Text.Length > 0 && tb.Text != "" && tb.Text != null) 
     { 
      tb.AutoCompleteMode = AutoCompleteMode.Suggest; 
      tb.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      tb.AutoCompleteCustomSource = getStringCollection(tb.Text,"Nama"); 
     } 
    } 
+0

참조를 얻기 및 TextChanged 이벤트에 대한 전체 코드를 보여주십시오. 컨트롤이 아직 유효한지 확인하고 있습니까? – TaW

+0

질문이 수정되었습니다. 컨트롤을 확인하는 방법은 여전히 ​​유효합니까? –

+0

intiail 설치를 방해하는 방식이 마음에 들지 않습니다. 항상 표시 이벤트에서 tb에 대한 참조를 만듭니다. 그런 다음 이전 핸들을 비운 다음 새 핸들을 설정합니다. 그러나 다른 셀로 chaging 할 때 새로운 셀은 새로운 editcontrol을 가질 것입니다. tb 레벨을 클래스 변수로 저장하고, null을 확인하고, 핸들을 지우고, 새로운 핸들을 잡아서 핸들을 설정해야한다고 생각합니다. 충돌이 얼마나 재현 가능합니까? – TaW

답변

0

이것은 내가 변화 할 것입니다 :

귀하의 코드 :

private void dataGridView1_EditingControlShowing(object sender, 
          DataGridViewEditingControlShowingEventArgs e) 
{ 
    DataGridView dgv = sender as DataGridView; 
    string headerText = dgv.Columns[dgv.CurrentCell.ColumnIndex].HeaderText.ToString(); 
    DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl; 
    removeAutoComplete(tb); 
    ... 

제안 편집 :

DataGridViewTextBoxEditingControl tb = null; // keep reference 

private void dataGridView1_EditingControlShowing(object sender, 
          DataGridViewEditingControlShowingEventArgs e) 
{ 
    DataGridView dgv = sender as DataGridView; 
    string headerText = dgv.Columns[dgv.CurrentCell.ColumnIndex].HeaderText.ToString(); 
    if (tb != null) removeAutoComplete(tb); // check for null and unhook old tb 
    tb = e.Control as DataGridViewTextBoxEditingControl; 
    ... 

다른 셀/행을 편집 할 때 셀에 동일한 TextBox 컨트롤이 적용되지 않으므로 동일한 텍스트 상자 컨트롤에 의존해서는 안됩니다. 따라서 un-hooking은 실패 할 수도 있고 아마도 다른 것들도 실패 할 수도 있습니다.

실제로 올바른 유형의 편집 컨트롤을 얻으려면 다른 검사가 필요합니다. 결국

는 아마 다음과 같이 확인 .. ComboBoxCells 또는 CheckBoxCell 등 같은 물건이있을 수 있습니다 :

if (tb is TextBox).. 
+0

테 제안에 대해 @TaW에게 감사하지만, 여전히 추락했습니다. 0x75C7D640 (shell32.dll) MYAPP.exe에서 throw 된 _Exception : 0xC0000005 : 0x0031003D._ –

+0

죄송합니다. – TaW

+0

on the program.cs _Application.Run (new My_Form()); _ –

관련 문제