2014-10-30 2 views
0

하드웨어 구성 xml 파일을 읽고 해당 데이터를 프로토콜 유형 및 채널별로 정렬하여 두 열의 gridview에 표시되는 추가 수정 작업을하고 있습니다. . 열 1은 채널 이름을 DataGridViewTextBoxColumn으로, 열 2는 SQL 데이터베이스 (채널 유형)의 쿼리에서 생성 된 드롭 다운 목록에서 항목을 선택할 수 있어야하는 DataGridViewComboBoxColumn으로 설정됩니다. 인터페이스 채널 형C에서 런타임에 DataGridVewComboBoxColumn의 DataSource를 변경하는 방법

"인터페이스"열들이 RS232 인 경우 "채널 형"을 구별하는 키를 RS422로 사용됩니다

SQL 데이터베이스 테이블 자체는 다음과 같습니다 몇 열이 , RS485 등.

DataGridView를 채우는대로 먼저 모든 RS422 채널 목록을 실행하고 RS232 목록 등을 순서대로 실행합니다. 그러나이 작업을 수행하려면 ComboBoxColumn에 대한 DataSource를 먼저 변경해야합니다. 예를 들어 "SELECT Channel_Type FROM Table1 WHERE Interface = 'RS422'" 두 번째 필드에 대해 를 실행해야 할 것 "표로부터 Channel_Type을 선택 WHERE 인터페이스 = 'RS232'"

그래서 코드에서 나는 다음과 같습니다 불행하게도 내가하고 있기 때문에, 정확하게 데이터 소스를 변경하는 방법을 잘 모르겠습니다

private void scanner() 
{ 
    //...code for parser that assembles a List<> ... 

    ChannelTypeColumn.DataSource = Populate("SELECT Channel_Type FROM Table1 WHERE Interface='RS422'"); 
    ChannelTypeColumn.ValueMember = "Channel_Type"; 
    ChannelTypeColumn.DisplayMember = ChannelTypeColumn.ValueMember; 

    for(int x = 0; x < ChannelRS422List.Count; x++) 
    { 
     RowDataBuffer[0] = ChannelRS422List.channel; 
     dgv.Rows.Add(RowDataBuffer); 
    } 

    ChannelTypeColumn.DataSource = Populate("SELECT Channel_Type FROM Table1 WHERE Interface='RS232'"); 

    for(int x = 0; x < ChannelRS232List.Count; x++) 
    { 
     RowDataBuffer[0] = ChannelRS232List.channel; 
     dgv.Rows.Add(RowDataBuffer); 
    } 
} 

private DataTable Populate(string query) 
{ 
    SqlCommand command = new SqlCommand(query, connection); 
    SqlDataAdapter adapter = new SqlDataAdapter(); 
    adapter.SelectCommand = command; 

    DataTable table = new DataTable(); 
    table.Locale = System.Globalization.CultureInfo.InvariantCulture; 
    adapter.Fill(table); 

    return table; 
} 

이 메서드를 사용하면 마지막 데이터 소스 정의의 항목 목록 만 표시됩니다.

도움과 조언을 주시면 감사하겠습니다.

감사합니다.

+0

각 쿼리에 대해 하나씩 두 개의 데이터 표를 만드는 것이 어떨까요? – Roger

+0

또는 두 가지 유형을 구별하기 위해 쿼리에서 GROUP BY를 사용하는 것은 어떻습니까? – Roger

+0

채널 유형 이름이 어느 인터페이스에 대해서도 같은 이름을 가질 수 있기 때문에 GROUP BY를 사용할 수 없으며 추가 편집시 문제가 발생할 수 있습니다. 또한 목록이 매우 커집니다. 여러 개의 데이터 그리드를 사용하면이 작업을 수행 할 수없는 경우 해결 방법이 될 수 있지만 모든 하드웨어 구성 파일에 다중 인터페이스가 있어야하기 때문에 GUI가 얼마나 깨끗한 지 알 수 없습니다. – Pita

답변

0

많은 노력 끝에 마침내 문제를 해결할 방법을 찾았습니다. 이것을 칼럼으로하는 대신에 필자는 필자가 필요로하는 행에 대해 셀로 처리해야한다.

private void scanner() 
{ 
    //...code for parser that assembles a List<> ... 

    for(int x = 0; x < ChannelRS422List.Count; x++) 
    { 
     RowDataBuffer[0] = ChannelRS422List.channel; 
     dgv.Rows.Add(RowDataBuffer); 
    } 

    int rowCount = 0; 
    for (int row = 0; row < dgv.Rows.Count; row++) 
    { 
     DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(dgv.Rows[row].Cells[1]); 
     cell.DataSource = Populate("SELECT Channel_Type FROM Table1 WHERE Interface='RS422'"); 
     cell.ValueMember = "Channel_Type"; 
     cell.DisplayMember = cell.ValueMember; 
     rowCount = row+1; 
    } 

    for(int x = 0; x < ChannelRS232List.Count; x++) 
    { 
     RowDataBuffer[0] = ChannelRS232List.channel; 
     dgv.Rows.Add(RowDataBuffer); 
    } 

    for (int row = rowCount; row < dgv.Rows.Count; row++) 
    { 
     DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(dgv.Rows[row].Cells[1]); 
     cell.DataSource = Populate("SELECT Channel_Type FROM Table1 WHERE Interface='RS232'"); 
     cell.ValueMember = "Channel_Type"; 
     cell.DisplayMember = cell.ValueMember; 
     rowCount = row+1; 
    } 
} 
관련 문제