2012-03-02 4 views
0

데이터 입력을 위해 winform DataGridView를 사용하고 있습니다. 문제는 내 사용자가 행을 입력했지만 클릭하지 않으면 그 행이 그리드의 데이터 소스 (메모리의 데이터 테이블)에 저장되지 않는다는 것입니다. 따라서 사용자가 양식을 제출할 때 DataGridview에 포커스가 있는지 감지하고 keypress (tab?)를 시뮬레이트하거나 포커스를 다른 컨트롤로 설정하거나 데이터를 변경하지 않고 현재 행을 저장하는 다른 작업을 수행하려고합니다.DataGridview.ContainsFocus returns wrong

는 항상 DataGridView.Focused처럼 false를 반환합니다. 내가 사용해야 할 다른 부동산이 있습니까? 이 데이터 행을 어떻게 저장해야합니까?

EDIT : DataTable을 만들고 DataGridview에 바인딩하는 방법은 Trouble using DataGridViewComboboxColumn for input을 참조하십시오. 그리고 datagridview not allowing user to delete row 나는이 동일한 DataGrid와 가진 또 다른 문제점을 보았습니다.

+0

실제로 제출 버튼을 클릭하면 포커스가 이미 눈금에서 나옵니다. 그것이 Grid.Focused가 틀린 이유입니다. 변경 사항이 데이터 소스에 커밋되지 않은 또 다른 이유가 있어야합니다. –

+0

@IgbyLargeman - 오케이, 어떻게해야합니까? – MAW74656

+0

여기서 워크 플로에 대해 좀 더 자세히 설명해 주시겠습니까?사용자가 행을 클릭하지 않았지만 저장이 트리거되고 있다고 가정합니다. 그게 무슨 소리 야? 나는 과거에는 비슷한 일을했지만 오래 전에는 세부 사항이 너무 어둡다. 항상 그렇듯이 일부 코드가 도움이 될 것입니다. –

답변

3

Windows 양식 컨트롤은 데이터 원본에 직접 연결할 수 있지만 BindingSource 컨트롤과 함께 사용하도록 디자인되었습니다. 폼 컨트롤에서 데이터 소스로 또는 데이터 소스에서 입력을 마샬링하는 데 사용됩니다.

디자이너에서 양식에 끌어다 놓을 수있는 구성 요소이며, DataGridview 컨트롤의 데이터 원본으로 설정할 수 있습니다.

양식에 있으면 디자이너를 사용하여 datagridview의 데이터 소스로 설정할 수 있습니다. 그런 다음 이벤트 핸들러 (예 : 양식로드 이벤트 핸들러)를 사용하여 데이터 소스를 바인딩 소스의 데이터 소스로 제공 할 수 있습니다.

바인딩 원본은 양식 컨트롤에서 기본 데이터 원본으로 데이터를 전송하는 방법과시기를 훨씬 세밀하게 제어 할 수 있습니다. 바인딩 소스를 사용하면 문제가 해결 될 수 있습니다. 그렇지 않은 경우 데이터를 저장하기 전에 바인딩 소스에서 EndEdit 메서드를 호출하면 해결되지 않은 편집 내용이 데이터 테이블에 기록됩니다.

간단한 예로는 새 Windows 양식 프로젝트를 만듭니다. 양식에 "datagridview1"이라는 이름의 datagridview, peopleBinding 소스 이름이있는 BindingSource 및 saveButton이라는 명령 단추를 추가하십시오. gridview1의 데이터 소스를 peopleBindingSource로 설정하십시오.

다음과 같이 form.Load 및 saveButton.Click에 대한 이벤트 처리기를 추가

public DataTable GetData() 
    { 
     DataTable t = new DataTable(); 
     t.Columns.Add("FirstName", typeof(string)); 
     t.Columns.Add("LastName", typeof(string)); 
     t.Rows.Add("Joe","Bloggs"); 
     t.Rows.Add("Fred","Bloggs"); 
     return t; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.AutoGenerateColumns = true; 
     DataTable people = GetData(); 
     peopleBindingSource.DataSource = people; 

    } 

    private void SaveButton_Click(object sender, EventArgs e) 
    { 
     DataTable t = peopleBindingSource.DataSource as DataTable; 
    } 

응용 프로그램을 실행하고 당신은 찾을 수 있어야 당신은 SaveButton_Click의 데이터 테이블을 검사하면 당신이로 변경 한 데이터는 지속됩니다.

당신은 Visual Studio를 당신을 위해 모든 코드를 작성하는 것을 선호하는 경우 :

  1. 은 "데이터 소스 추가 ..."마법사를 사용하여 새 데이터 소스를 추가합니다.
  2. 데이터 원본 창에서 테이블을 양식으로 끌어옵니다.

Visual Studio에서 필요한 DataGridView, BindingSource 등을 추가하고 모두 연결합니다. 그런 다음 코드를 검사하여이 코드가 모두 어떻게 맞는지 확인할 수 있습니다.

+0

- 큰 설명! 하지만, 나는 고집스럽고, 내 설정을 변경하지 않고이 작업을 수행 할 수있는 방법을 찾았습니다. 내가 한 모든 것은 개념을 사용하고 제출 버튼 핸들러에서이 코드를 호출 한 것입니다 : if (gridDowntime.IsCurrentRowDirty) { gridDowntime.BindingContext [downtimeEntries] .EndCurrentEdit(); } ' – MAW74656