2013-07-24 2 views
1

Все, у меня есть UserCostrol, который мне недавно пришлось изменить. Это изменение потребовало от меня ссылки на форму Parent и использования свойства из этой формы. Эти ссылки, казалось бы сломаны дизайнер - я получаю сообщение об ошибкеКак правильно указать родительскую форму с UserControl

«Не удается привести объект типа„System.Windows.Forms.Form“к типу 'Project.SettingsForm»

который был описан в Unable to cast object of type 'System.Windows.Forms.Form' to type 'Project.Form1'.

Я добавил свойство обрабатывать ссылку на Parent форме, как описано в ответе refernced выше, но теперь ошибка дизайнер говорит

«Не удалось привести объект типа«System.Windows. FormsPanel ', чтобы напечатать «Project.SettingsForm».

Первая строка которой compilier стонет о помечается '<-- Here' в коде ниже

public partial class UiSettingFascia : UserControl, ISettingsControl 
{ 
    public UiSettingFascia() 
    { 
     InitializeComponent(); 
    } 

    private void UiSettingFascia_Load(object sender, EventArgs e) 
    { 
     LoadSettings(); 
     CheckBoxShowTabs.CheckedChanged += Workbook_StateChanged; 
     CheckBoxShowVirticalScroll.CheckedChanged += Workbook_StateChanged; 
     CheckBoxShowHorizontolScroll.CheckedChanged += Workbook_StateChanged; 
    } 

    public void LoadSettings() 
    { 
     UserSettings userSettings = UserSettings.Instance(); 
     ... 
     MainRibbonForm mainRibbonForm = (ControlParent).MainRibbonForm; // <-- Here. 
     ... 
    } 
} 

Чтобы попытаться решить исходную задачу [«Не удалось привести объект типа«System.Windows .Forms.Form»к типу„“Project.SettingsForm»] Я создал следующее свойство

public SettingsForm ControlParent 
{ 
    get { return Parent as SettingsForm; } 
} 

Как я могу обойти эту проблему [«Невозможно лишить объект типа« System.Windows.Forms.Panel »для ввода« Project.SettingsForm »«] при сохранении моей функциональности UserControl?

Спасибо за ваше время.

+0

использовать событие, чтобы поговорить с родительской формы. – Jonesopolis

+0

Почему бы вам просто не использовать: 'var settingsForm = (SettingsForm) this.ParentForm;'? –

+0

@AlexFilipovici - это то, во время компиляции времени разработки 'UserControl' элемента управления не должно ничего знать о типе родительских форм. Я попытался «отвлечь его», используя свойство, которое все еще не идеально, понятно ... – MoonKnight

ответ

1

Добавить this extension method:

public static class DesignTimeHelper 
{ 
    public static bool IsInDesignMode 
    { 
     get 
     { 
      bool isInDesignMode = (
       LicenseManager.UsageMode == LicenseUsageMode.Designtime || 
       Debugger.IsAttached == true); 
      if (!isInDesignMode) 
      { 
       using (var process = Process.GetCurrentProcess()) 
       { 
        return process 
         .ProcessName.ToLowerInvariant() 
         .Contains("devenv"); 
       } 
      } 
      return isInDesignMode; 
     } 
    } 
} 

Затем в методе LoadSettings:

public void LoadSettings() 
{ 
    if (!DesignTimeHelper.IsInDesignMode) 
    { 
     var settingsForm = (SettingsForm)this.ParentForm; 
    } 
} 
+0

+1. Спасибо за вашу помощь. Это выглядело очень многообещающе, но я все еще получаю «Невозможно бросить ...» при попытке добавить «UserControl» в мою форму. См. Мое редактирование для получения дополнительной информации ... – MoonKnight

1

Похоже, что вам нужно вводить код в режиме разработки. Во время разработки родительский элемент UserControl может фактически быть Visual Studio (или некоторым его компонентом). Вот как Visual Studio может предоставить вам графический интерфейс для работы с элементом управления во время разработки —, на самом деле на нем находится элемент управления; это фактически выполняется.

Возможно, вам нужно установить атрибут свойства, который принимает родительскую форму, чтобы придать ему некоторое другое поведение во время разработки. Кроме того, я думаю, что есть свойство в UserControls, которое называется DesignMode, которое будет истинным, если элемент управления находится в режиме разработки — таким образом, вы можете дать управление различным поведением во время разработки и времени выполнения. В MSDN есть много статей о создании элементов управления и настройке их времени разработки и времени выполнения.

+0

+1 спасибо за ваше время. – MoonKnight

Смежные вопросы