2017-10-12 4 views
2

SQL 문을 사용하여 선택한 비즈니스 단위 (아래 예제에서 하드 코딩 됨)에 대해 직원의 성 및 이름이 (정렬 된) 목록 상자에 표시되는 응용 프로그램을 작성하고 있습니다. 사원 (액세스) 데이터베이스의 색인은 직원 번호입니다.- Listbox 항목의 데이터베이스 키는 어떻게 찾습니까?

목록 상자에서 항목을 선택하면 새 형식으로 직원에 대한 특성을 얻기 위해 데이터베이스를 읽을 수있는 직원 번호를 확인할 방법을 찾을 수 없습니다. 트릭이 keyvaluepair를 사용하고 있지만 이것이 코딩 된 방법에 대한 지침이 필요하다고 생각합니다. 코드 샘플은 아래에 있으며 귀하의 도움을 기대해 주셔서 감사합니다.

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
using System.Data.OleDb; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     private OleDbConnection connection = new OleDbConnection(); 
     public Form1() 
     { 
      InitializeComponent(); 
      connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Mark\Documents\Employee.accdb;Persist Security Info=False;"; 
      listBox1_Load(); 
      } 

    void listBox1_Load() 
     { 
      try 
      { 
      // Open database and select the data to be shown in the List Box - hard-coded example here 
      connection.Open(); 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = connection; 
      string query = "select ID, FirstName, Surname from Employee where BusinessUnit = 'Finance'"; 
      command.CommandText = query; 

      OleDbDataReader reader = command.ExecuteReader(); 

      // Read records returned by the query and populate the list box with the employee name 
      while (reader.Read()) 
      { 
       listBox1.Items.Add(reader["Surname"] + ", " + reader["FirstName"]); 
      } 
      connection.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error " + ex); 
      } 
     } 

     private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 
    } 
} 

답변

1

목록 상자에 숨겨진 필드를 추가 할 수 있는지 확실하지 않습니다. 그러나받은 쿼리를 변수 (예 : datareader를 사용하는 것과 반대되는 datatable)에 저장하면 사용자가 클릭하여 목록 상자에서 옵션을 선택하면 해당 쿼리를 사용하여 쿼리에서 연결된 레코드를 찾을 수 있습니다 선택한 항목의 목록 상자의 인덱스를 사용합니다.

그러나 쿼리에서 목록 상자가 아니라 결과 정렬이 수행되도록해야합니다.

마이크

+0

감사합니다. 마이크 - 당신의 마지막 요지는 제가 생각하지 못했고 제 인생을 훨씬 쉽게 만들어야합니다. – Markys

+0

문제가 없으면 목록 상자의 데이터 소스와 데이터 테이블을 바인딩하고 목록 상자의 valuemember 및 displaymember 속성을 설정하는 것이 좋습니다. – Micktommyord

0

나는 사전에 DB에서 데이터를 저장하는 것, 키가 ID이고 배열은 이름과 성으로 구성되는 경우의이

Dictionary<int,String[]> 

을 가정 해 봅시다. 그러면 listBox를 사전 데이터로 채 웁니다.

1

하지 적절한 대답 만 아이디어 :

은 어쩌면 당신은 배열이나 사전

listBox1.DataSource = <Array or Dictionary>; 
listBox1.DisplayMember = "NameOfColumnToBeDisplayed"; 
listBox1.ValueMember = "NameOfColumnToUseValueFrom"; 

그리고 디스플레이에 결과를 변환 같은 것을 시도 할 수 = 값 (예를 들어, 값은 직원이 될 것입니다! id)

+0

형식 "성, 이름"하나의 열이 그래서 DisplayMember 그렇게 할 수 있는지 확실하지 않다 더 있다는 것입니다 표시되는 데이터입니다. 이전에 배열을 사용하여 시도했지만 목록이 목록 상자에서 자동으로 정렬되므로 항목이 일치하지 않습니다. – Markys

+0

그는 두 열을 문자열로 연결할 수 있습니다. 실제로 그의 목적과 그가 쉽게 조작 할 수있는 컬렉션을 성공적으로 검색하는 방법에 달려 있습니다. 마지막으로 C#을 건드린 지 오래되었지만 비슷한 점을 기억합니다. 아직도, 그것은 단지 생각입니다. – abr