2012-02-24 4 views
0

У меня есть настраиваемый элемент управления LayoutPanel, который содержит дочерние элементы управления. Я хочу, чтобы все дочерние элементы управления содержали определенное свойство из контейнера Parent панели макета. Я пытался использовать следующий код для создания различных дочерних элементов управления, которые обеспечат хранение имущества ChartPropertyOwner, опираясь на наследовании считать тип (метки, кнопки, стандартные формы элементов управления)Наследование элементов управления Windows Forms в C#

public partial class ManipControl : System.Windows.Forms.Control { 

     public ChartPropertySet ChartPropertyOwner { get; set; } 

     public ManipControl(ChartPropertySet _cps) { 
      ChartPropertyOwner = _cps; 
      InitializeComponent(); 
     } 
} 

инициализирует с следующее утверждение:

Button btnManipDel= new ManipControl(_cps); 

Я получаю сообщение об ошибке:

не может неявно преобразовать тип 'ManipControl' в «System.Windows.Forms.Button '

Почему неявное преобразование завершается неудачно и как это можно решить?

+0

кнопка кнопка и не имеет никакого отношения к ManipControl. Если вы хотите, чтобы элемент управления Button отображал ваши свойства, имплицируйте интерфейс IMyInterface и наследуйте от Button. public class MyButton: Button, IMyInterface {// Делаем бизнес} – Lloyd

+0

Я не думаю, что это хорошая идея создать элемент управления без открытого конструктора без параметров. – ja72

+0

Можете ли вы рассказать об этом @ ja72? – sammarcow

ответ

2

ManipControl-> System.Windows.Forms.Control

Button-> System.Windows.Forms.Control

Кнопка не гарантированно будет ManipControl

Чтобы решить эту проблему, вы можете просто явно нажата на кнопку.

Button btnManipDel= (Button)new ManipControl(_cps); 

Я не знаю, что это лучшее, что можно сделать в качестве кнопки! = ManipControl. Единственные гарантированные функции получаются из базового класса System.Windows.Forms.Control. Это лучший класс приведение к, и я считаю, будет неявно (но я не уверен):

System.Windows.Forms.Control btnManipDel= new ManipControl(_cps); 

Вы можете прочитать на Liskov's Substition Principle и контрвариации и ковариации.

0

Преобразование не выполняется, поскольку ManipControl является элементом управления, а Button является элементом управления, ManipControl - это не кнопка.

Вы можете изменить свой класс на интерфейс и создать новый ManipButton:

public interface IManipControl 
{ 
    int ChartPropertyOwner { get; set; } 
} 

public class ManipButton : Button, IManipControl 
{ 
    public int ChartPropertyOwner{get;set;} 
} 
Смежные вопросы