2013-02-19 1 views
6

ListBox.Refresh() 메소드를 오해 한 것 같아요. 누군가 나를 도울 수 있기를 바랬습니다.ListBox가 데이터 소스를 설정했지만 Refresh가 아무 것도하지 않습니다.

무엇을하려고합니까 :
Windows 양식을 초기화 할 때 목록 상자의 데이터 (원본 = SQL 데이터베이스 테이블)를로드하려고합니다. 또한 사용자가 데이터베이스에 데이터를 추가 할 때 목록 상자를 업데이트하고 싶습니다.

논리 : 내 DBQuery 정적 클래스 내 정적 메소드가

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

DBquery.informationRetreval() : 나는 내 소스로 SQL 데이터베이스를
,이 설정됩니다. 모든 작업은 데이터베이스에서 테이블을 설정 한 다음 테이블을 반환합니다.

public Settings() 
    { 
     InitializeComponent(); 
     listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 
    } 

사용자가 더 많은 데이터를 추가 할 때 : 나는 내가 추가하는 방법을 호출

나는 (나의 목록 상자가 기존 데이터로드)를 InitializeComponent를 같은 방법 내에서 데이터 소스를 설정 데이터베이스에 대한 데이터는 내가 전화 :

listBoxDays.Refresh(); //update listbox 

문제점 : 이 목록 상자를 업데이트하지 않습니다. 내 목록 상자 초기화시 데이터가 채워 지지만 변경되지 않으면 새로 고침이 작동하지 않습니다. 왜 그런가요? DataSource를 다시 설정할 수는 있지만 느껴진다. 몇 가지 문서를 살펴본 후에 이벤트 핸들러 인 DataSourceChanged를 찾았습니다. 그럼에도 불구하고 왜 일을 새롭게하지 않겠습니까?

양해 해 주셔서 감사합니다. 좀 더 명확해야 할 필요가 있으면 알려주십시오.

답변

9

Refresh() : 컨트롤에서 클라이언트 영역을 무효화하고 즉시 자체 및 모든 자식 컨트롤을 다시 그립니다.

새로 고침은 컨트롤을 다시 바인딩하지 않고 컨트롤을 다시 그립니다. 당신은

listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

재 바인드 함께 다시 DataSource을 설정해야합니다.

출처 : (. 예를 다른 쿼리를) 객체가 변경되었을 때 Microsoft MSDN

+0

이벤트 핸들러를 사용하는 것이 더 합리적일까요 : ListControl.DataSourceChanged ... 데이터 소스가 변경되면 발생합니까? – 40Alpha

+0

컨트롤을 정리하고 바인딩하는 메서드를 만들고 InitializeComponent() 및 .Refresh() 함수를 사용하는 다른 모든 곳에서 호출하는 메서드를 만드는 것이 좋습니다. –

+1

또한 적어도 VB 버전에서 데이터를 데이터 소스에 바인딩 할 때 항목을 지울 수 없다는 오류가 발생했습니다. 내가 추가해야만하는 것은'Listbox.DataSource = Nothing'이라는 줄을 추가 한 다음 내 항목을 지우고 내 데이터를 리바 인딩하는 것입니다. – PsychoData

15

그것은 단지 새로 고침 것 아닌 데이터입니다. 당신은 이것을 할 수 있습니다 :

listBoxDays.DataSource = null; 
listBoxDays.DataSource = DBQuery.informationRetreval().DefaultView; 

언제든지 ... 새로 고침해야합니다.

+2

위대한! 나는 우리가 이것을해야만하는 이유가 없다. – rajeemcariazo

+0

이것은 :이 질문/문제와 관련하여 많은 다른 답변에서 "데이터가 아니라 객체가 변경되었을 때 (예 : 다른 쿼리) 데이터가 새로 고침 될 때만 새로 고침"이 누락되었습니다. – Pavenhimself

관련 문제