2008-10-16 4 views
9

일부 미리 정의 된 컨트롤 (groupbox, button, datagridview)이있는 UserControl이 있으며이 컨트롤은 protected로 표시되고 components 변수는 protected로 표시됩니다.DataGridView가 상속 된 UserControl에서 잠김

이 기본 UserControl에서 다른 UserControl을 상속하지만 DataGridView는 항상 디자이너에서 잠겨 있습니다.

ISupportInitilize를 구현하는 DataGridView와 관련이 있다고 생각됩니다.

public class BaseGridDetail : UserControl 

DataGridView 컨트롤 (et al)이 정의되어 있습니다.


public class InheritedDetail : BaseGridDetail 

DataGridView 컨트롤은

잠겨


사람이 어떻게 inheritenace 후 디자이너에서이 컨트롤을 사용할 수 있도록하는 아이디어가 있습니까?

답변

10

DataListView (및 다른 컨트롤)는 시각적 상속을 지원하지 않습니다. 희망 사항이 아닌 연결 문제 logged here이 있습니다.

다른 양식 컨트롤과 함께 기록 된 유사한 문제가 있습니다. flowlayoutpanel.

시각적 상속을 강제로 수행 할 방법을 찾을 수 없습니다.

여기 connect에 대한 공식적인 답변입니다 : "이 특정 릴리스의 경우는 DataGridView를 시각적 intheritance 사용하도록 설계되지 않았습니다 우리가 우리의 미래 릴리스 계획 할 때 우리는 마음에 당신의 제안을 유지합니다."(26)이다 를/05/2006.

업데이트 : this blog post which may have the answer

편집을 발견 : 나는 블로그 게시물의 주장을 확인할 수 없습니다. might be the latest on this issue

런타임에서도 DataListView를 조작 할 수있는 것처럼 보이므로 시각적 속성 (및 기타 설정)을 설정할 수 있습니다. 그것은 큰 타협이 아닙니다.

+0

여전히 VS2010에 있습니다. http://stackoverflow.com/questions/15089289/cannot-visually-change-datagridview-in-inherited-form/15090076#15090076 또한 .NET 프로필에 몇 가지 추가 정보를 추가했습니다. –

1

답변을 남겼지만 질문을 다시 읽고 삭제하기로 결정했습니다.

상속 된 컨트롤에서 수정하려는 DataGridView에 대한 설명은 무엇입니까? 기둥 이니? 나는이 같은, 내 기본 UserControl을에서 보호 방법을 설정하고 그것에 그리드의 열 컬렉션을 전달하여이 작업을 수행 할 수있었습니다 :

// in base UserControl 
public BaseGridDetail() 
{ 
    InitializeComponent(); 

    InitGridColumns(dataGridView1.Columns); 
} 

protected virtual void InitGridColumns(DataGridViewColumnCollection columns) 
{ 
    columns.Clear(); 
} 

이제 단순히과 같이,이 메소드를 오버라이드 (override) 할 수 있습니다 파생 된 컨트롤 :

// in InheritedDetail 
protected override void InitGridColumns(DataGridViewColumnCollection columns) 
{ 
    base.InitGridColumns(columns); 
    // add my own custom columns 
} 
+0

디자이너에서 모든 컨트롤의 DataGridView를 제외하고 해당 속성이 변경 될 수 있습니다. 그것은 디자이너 관점에서 완벽하게 잠겨 있습니다. – benPearce

+0

네, 질문에 Rob의 답변을 읽은 후, 왜 내 응용 프로그램에서 "InitGridColumns"경로를 내려야 만하는지 기억했습니다. 시각적 상속은 DataGridView에서 작동하지 않습니다. –

5

[1] 만들고, 사용자 지정 UserControl을

[2] 사용자 정의는 아래 상속 된 DataGridView를 사용 UserControl을합니다

[Designer(typeof System.Windows.Forms.Design.ControlDesigner))] 
public class InheritedDataGridView : DataGridView { } 

[3] 당신의 사용자 정의 UserControl을, 그리고 비올라에서 상속!

[4] 오는

이 즐겨 "System.Design"DLL을 추가하는 것을 잊지 말아.

3

패널 컨트롤에 DataGrid를 추가하고 패널 및 DataGrid의 수정자를 protected로 설정합니다. 그러면 상속 된 폼 디자인 타임에 그리드의 속성에 액세스 할 수 있습니다.

+0

좋은 제안! 적어도 우리는 자식 폼에서 DataGrid의 위치를 ​​결정하고 크기를 조정할 수 있습니다. 어느 것이 모두 하나의 필요가 되는가? –

+0

감사합니다. 우리는 4 년 전에 해결책을 찾았으며 지금까지이 게시물을 발견하지 못했습니다! – Nullpoint

0

원래 기계 생성 코드 인 xx.designer.cs 에 정의 된 [private]에서 [protected]로 속성을 변경하십시오.

protected System.Windows.Forms.Button btnSave; 

하고 재 구축하는 예

private System.Windows.Forms.Button btnSave; 

위한

.

그러면 상속 된 컨트롤의 속성을 변경할 수 있습니다.

관련 문제