2016-09-20 4 views
3
public delegate void MyEventHandler(object sender, DataGridViewCellEventArgs e); 
public event MyEventHandler SomethingHappened;  

private void dataGridViewCargo_CellContentClick_1(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.RowIndex >= 0) 
    { 
     DataGridViewRow rowID = this.dataGridViewCargo.Rows[e.RowIndex]; 
     cargoDisplayMessageIdTextBox.Text = rowID.Cells["iDDataGridViewTextBoxColumn"].Value.ToString(); 

     DataGridViewRow rowSender = this.dataGridViewCargo.Rows[e.RowIndex]; 
     cargoDisplaySubjectTextBox.Text = rowSender.Cells["subjectDataGridViewTextBoxColumn"].Value.ToString(); 

    } 
} 



protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 
    Invoke(new MyEventHandler(SomethingHappened)); 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

첫 번째 부분은 행을 선택할 때 내 텍스트 상자를 업데이트합니다. 두 번째 부분은 이벤트 처리기에서의 시도입니다. 키보드로 그리드를 탐색하여 텍스트 상자를 업데이트하려고합니다. 따라서 파란색으로 강조 표시된 행이 자동으로 텍스트 상자에 채워집니다.화살표 키를 사용하여 DataGridView를 탐색하여 텍스트 상자를 업데이트하십시오.

dataGridViewCargo_CellContentClick에 포함시켜 이벤트 처리기를 호출하려고했지만 발신자와 전자가 전달되지 않고 매개 변수 개수 불일치 오류가 발생하거나 인스턴스 메소드에 대한 위임자가 'this'를 가질 수 없습니다. 이 아이디어는 버튼을 눌러 CellContentClick 이벤트를 호출하는 것이 었습니다.

도움이 매우 친절 할 것입니다.

+0

CellContentClick은 실제로 실제 콘텐츠를 치기 때문에 나쁜 선택입니다. 왜 ProcessCmdKey를 사용해야합니까? dgv는 disbelled하지 않는 한 그 자체로 모든 것을해야합니다. CurrentCellChanged 이벤트를 코딩하면됩니다! – TaW

답변

2

DataGridView 행 사이를 이동하는 데 마우스 또는 화살표 키를 사용하면 해당 데이터 소스의 위치가 변경되고 동일한 데이터 소스에 바인딩 된 모든 컨트롤에 새 위치의 값이 표시됩니다.

또한 데이터 바인딩을 사용하지 않는 경우 DataGridView이라는 SelectionChanged 이벤트가 발생하고 컨트롤을 업데이트하는 데 사용할 수 있습니다.

그래서 당신은 문제를 해결하기 위해 다음 옵션 중 하나를 사용할 수 있습니다

  • 바인드 그 TextBox 컨트롤을하는 DataGridView 사용하는 동일한 데이터 소스에.

  • 이벤트를 DataGridView으로 사용하십시오. 당신이 DataSourceDataGridView을 결합하면

, 당신은 단순히 데이터 바인딩이 너무 귀하의 TextBox 컨트롤에 사용할 수 있습니다. 이러한 TextBox 컨트롤을 각 행을 클릭하여 표시하려는 데이터 소스 필드에 바인딩하는 것으로 충분합니다. 당신은 데이터 바인딩 디자이너를 사용하거나 사용하여 코드를 수행 할 수 있습니다 당신은 데이터 바인딩을 사용하지 않는 경우,

var data = GetDataFromSomeShere(); 
dataGridViewCargo.DataSource = data; 
cargoDisplayMessageIdTextBox.DataBindings.Add("Text", data, "ID"); 
cargoDisplaySubjectTextBox.DataBindings.Add("Text", data, "Subject"); 

을 간단히 DataGridViewSelectionChanged 이벤트를 사용하고 해당 필드를 찾을 수 DataGridViewCurrentRow 속성을 사용하고 업데이트 할 수 있습니다 TextBox 대조 :

private void dataGridViewCargo_SelectionChanged(object sender, EventArgs e) 
{ 
    var row = dataGridViewCargo.CurrentRow; 
    cargoDisplayMessageIdTextBox.Text = 
     row.Cells["iDDataGridViewTextBoxColumn"].Value.ToString(); 
    cargoDisplaySubjectTextBox.Text = 
     row .Cells["subjectDataGridViewTextBoxColumn"].Value.ToString(); 
} 

데이터 바인딩 (첫 번째 옵션)을 사용하는 것이 좋습니다.

+0

감사합니다. 제안 된 데이터 바인딩 메서드를 사용하지만 SelectionChanged 대안을 사용하려고했지만 private void dataGridViewCargo_SelectionChanged (개체 보낸 사람, EventArgs e)를 쓸 때 내 dataGridViewCargo에 대한 참조가없는 것 같습니다. 그 이유가 뭔지 아십니까? – Connor

+1

반갑습니다. 두 번째 옵션의 경우 코드 또는 디자이너를 사용하여 이벤트 핸들러를 이벤트에 첨부하는 것을 잊지 말아야합니다. 또한 메서드에 눈금이 표시되는 범위에 이벤트 핸들러를 작성해야합니다. –