디자이너 친화적 인 사전 바운드 데이터 소스로 파생 된 콤보 박스를 만드는 방법은 무엇입니까?
-
19-08-2019 - |
문제
데이터베이스에서 검색하는 객체 목록에 바인딩 된 System.windows.forms.combobox에서 파생 된 컨트롤을 작성하고 싶습니다. 아이디어는 다른 개발자가 원하지 않는 한 데이터 소스에 대해 걱정할 필요 없이이 컨트롤을 자신의 형태로 삭제할 수 있습니다.
Combobox를 확장 한 다음 생성자에 DataSource, DisplayMember 및 valuember를 설정하려고했습니다.
public class CustomComboBox : ComboBox
{
public CustomComboBox()
{
this.DataSource = MyDAL.GetItems(); // Returns List<MyItem>
this.DisplayMember = "Name";
this.ValueMember = "ItemID";
}
}
내가 달릴 때 작동하지만 Visual Studio가 어떤 형태로든 추가되면 많은 오류가 발생합니다. 내가 얻는 오류는 다음과 같습니다.
"속성에 대한 코드 생성 '항목'이 실패했습니다. 오류는 다음과 같습니다.
이것을 달성하는 올바른 방법은 무엇입니까 (c#, winforms, .net 2.0+)?
해결책 2
DesignMode 속성은 생성자에서 작동하지 않습니다. 한동안 인터넷 검색 에서이 Licensemanager를 발견했습니다.
if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
{
// Do your database/IO/remote call
}
그러나 Licensemanager는 생성자에서만 작동합니다. 이벤트 핸들러의 경우 DesignMode를 사용하십시오.
원천: http://dotnetfacts.blogspot.com/2009/01/Indistifying-Run-Time-andDesign-Mode.html
다른 참조 : http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658.aspx
다른 팁
문제는 디자이너가 실제로 프로그램을 실행하는 것보다 약간 다른 맥락에서 컴파일과 실행을 수행한다는 것입니다.
생성자에서 코드를 다음과 같이 랩핑 할 수 있습니다.
if (!DesignMode)
{
//Do this stuff
}
디자이너는 설계 중에 초기화 코드를 실행하지 않도록 지시합니다.
내 일반적인 의견 - 여기서 - 디자인 모드는 컨트롤이 설계 표면에 직접 배치되는 것 이외의 다른 상황에서 신뢰할 수 없습니다 - 즉 컨트롤이 다른 컨트롤에 배치되면 DesignMode가 설계 모드에 있더라도 사실이 아닙니다. 디자인 모드에 있는지, 특히 상속 된 컨트롤이 있는지 알 수있는 신뢰할 수있는 방법을 찾지 못했습니다. 컨트롤이 비 시각 제어 (예 : 일반적인 대화 상자)에서 상속되는 경우 사이트를 사용하는 변형조차도 신뢰할 수 없습니다.
보다 http://keyofdflat.livejournal.com/5407.html (마지막 주석을 읽으십시오).