2014-04-16 2 views
1

테이블 어댑터와 함께 Visual Studio 2012 및 Access 2010을 사용하고 있습니다. 이것은 학교 프로젝트를위한 것입니다.Access 테이블 기본 ID 목록을 배열로 가져 오기

현재 테이블 # 1과 많은 관계가있는 테이블 CUSTOMER가있는 Access 데이터베이스를 사용하는 C# 시스템을 개발 중입니다. 이것은 하나의 고객이 많은 차량과 관련 될 수 있기 때문입니다.

차량에 시스템을 입력 할 때 해당 차량을 연결할 시스템의 모든 고객 이름을 표시하는 필수 콤보 박스가 있습니다 (차량은 고객과 연결되어야 함).

내 문제는 CUSTOMER 테이블이 자동 증가를 사용하므로 고객이 삭제되면 고객 ID가 더 이상 반드시 순차적이지 않다는 것입니다. 내 콤보 상자의 논리는 최상위 고객 이름이 고객 ID 1이고 두 번째 고객 이름이 2라고 가정합니다. 이것은 내 응용 프로그램에 불일치를 일으키는 것입니다.

이 문제를 해결하기위한 아이디어는 런타임에 고객 테이블의 모든 고객 ID를 배열로 순서대로로드 한 다음 해당 배열을 참조로 사용하는 것입니다 (분명히 추가되거나 삭제 된 고객으로 업데이트). 그러나 ID를 얻기 위해 테이블을 스테핑하는 코드를 작성하는 방법이나 이것이 최상의 솔루션 일지는 모르겠습니다. 이견있는 사람?

+0

'ComboBox'에 대해 말씀 드렸으니 창문 양식 응용 프로그램을 사용하고 있습니까? –

+0

왜 순서가 처음부터 문제가되는 것입니까? 콤보 박스를 고객과 함께로드하고 ValueMember 속성을 고객의 Id 필드로 설정하면 왜 시퀀스에 문제가 발생합니까? – Crono

+0

@drew_w : 예, Windows Forms를 사용하고 있습니다. – user3255843

답변

0

고객을로드 할 때. 값 필드를 customerID로 설정하고 텍스트 필드를 customerName 필드로 설정합니다.

+0

나는 그것을 실제로했지만, SelectedValue 옵션을 사용하여 int로 캐스트해야합니다. 모두에게 감사드립니다. returnedCustomerID = (int) customercombo.SelectedValue; – user3255843

1

Windows Forms 콤보 상자에 데이터를 추가 할 때 가능한 한 가지 방법은 개체가 "ToString"을 재정의하는 것입니다. 그런 다음 실제 객체를 콤보 상자 목록에 배치 할 수 있습니다. 사용자가 선택한 인덱스의 고객이 당신이 할 수있는 변화 선택하면 이제

// declare customers 
Customer []myCustomers = null; 

// load customers ... then show: 
myCombobox.Items.AddRange(myCustomers); 

: 당신은 그냥 콤보 상자에 일반적으로 항목을 추가 그리고

public Class Customer { 
    public int CustomerId { get; set; } 
    public string First { get; set; } 
    public string Last { get; set; } 

    // here is where you decide what to display in the combo box: 
    public override string ToString() { return First + Last; } 
} 

: 개체를 가정 할 수는 다음과 같이 정의된다 실제 고객 객체를 얻을 다음은 :

이제
var customerObject = (Customer)myCombobox.Items[myCombobox.SelectedIndex]; 

당신은 그들이 콤보 보에 추가되는 순서에 대해 걱정할 필요가 없습니다 x 또는 색인 또는 기타. 개체는 데이터베이스에서 ID를 저장하고 모든 것을 기반으로 작동합니다! 행운을 빌어 요!

2

Do not EVER은 레코드 자동 증가 번호와 일치하는 결과 집합 내의 레코드 위치에 의존합니다. 뿐만 아니라 이것은 절대적으로 신뢰할 수는 없지만 UI 필터링 또는 주문과 관련하여 모든 종류의 문제를 제시 할 수 있습니다. 예를 들어 귀하의 시나리오에서 아마 당신의 콤보 박스를 알파벳 순서로 이름별로 정렬하고 싶을 것입니다. 따라서 레코드 인덱스 일치 레코드 자동 증가 값을 사용하면 버그와 데이터 손상이 발생할 수 있습니다.

지금 실제 문제로 이동 중 ...당신은 Customer 개체의 모음에 콤보 상자를 결합하고 해당 속성의 두 가지를 설정할 수 있습니다

class Customer 
{ 
    public int Id {get; set;} 
    public int Name {get; set;} 
} 

이 : 이제 당신의 Customer 클래스가이처럼 가정하자

combobox.DisplayMember = "Name"; 
combobox.ValueMember = "Id"; 

DisplayMember 속성의 어떤 속성이 컨트롤을 알려주는 목록 내에서 표시하기 위해 사용해야하는 객체이며, ValueMember은 값으로 사용할 필드를 결정합니다. 후자는 databinding, 에 특히 유용합니다. 나는이 시나리오에서 사용해야한다고 생각합니다..

프로그래밍 방식으로 선택한 고객의 Id 값에 액세스하려면 combobox.SelectedValue 속성을 확인하십시오.

drew_w의 기술을 사용할 수도 있지만 작동하는 동안 가능한 경우 데이터 바인딩에서 사용하기가 쉽지 않습니다.

관련 문제