Poornima Santhosh Ответов: 1

Как получить входную сборку во время разработки в C#?


Я создал пользовательский компонент в одном проекте с UITypeEditor. В классе component у меня есть один атрибут MyFormSettings: это открытая форма. он имеет один combobox, который отображает все имена форм в сборке ввода.

В тестовом проекте я добавил пользовательский компонент в toolbox, и когда я перетаскиваю компонент в тестовый проект, то создаю новую форму. Я могу получить окно свойств с помощью свойства Myformsettings. но я получаю ошибку ССЫЛКА на объект не установлена


Type formType = typeof(форма);
Сборка myAssembly = сборка.GetEntryAssembly();
(типа foreach в сборке.метод GetType())
{
// foreach (Type type in types)
if (formType.IsAssignableFrom(тип))
{
Поле combobox1.Предметы.Добавить(type.Name);
}
}


Как я могу получить входную сборку во время проектирования?

Что я уже пробовал:

Я получаю не в состоянии получить информацию о сборке записи во время разработки.

Ralf Meier

Ваш вопрос мне непонятен.
Что вам нужно ? Я полагаю, вы хотите получить форму, в которой экземпляр вашего компонента ...?

Poornima Santhosh

Я хочу создать пользовательский компонент для приложения Windows, который будет предоставлять свойство во время разработки, которое является выпадающим списком. Раскрывающийся список должен содержать все формы Windows проекта, ссылающиеся на этот пользовательский компонент.

Ralf Meier

.. Итак, вы хотите построить список тех форм, где используется / создается ваш компонент ...?

Poornima Santhosh

да

Ralf Meier

У меня есть VB-код, который доставляет компонент, который является родительской формой во время разработки.
Это то, что я могу дать вам - возможно, это поможет вам - но это не то решение, которое вы хотите иметь ...
Скажи мне свое решение ...

Poornima Santhosh

Дайте мне код, который я выполню и проверю в c#

Ralf Meier

Извините... Что ты имеешь в виду?

Poornima Santhosh

Мне нужен путь сборки родительской формы.

Poornima Santhosh

Мне удалось получить выпадающий список со всеми формами в том же проекте, что и customcomponent. но не удается получить формы из основного приложения компонента.

Poornima Santhosh

Я хочу, чтобы список компонент parentform управления список событий?

Ralf Meier

Что ты имеешь в виду?
Если компонент знает, что это родительская форма, он может получить доступ к каждому элементу управления в форме. Это также означает, что он может также получить доступ к каждому из событий каждого (или определенного типа) элемента управления.
Но, конечно, я могу дать вам больше информации, если вы уточните свой вопрос ...

Poornima Santhosh

Я не получаю список событий.
Я использую этот код
Контроль.метод GetType().GetEvents();

Ralf Meier

Я видел это в твоем другом вопросе.
Чего вы пытаетесь достичь ? Я полагаю, вы хотите знать, какие события из существующих элементов управления используются (имеют делегатов) ? Я не делал этого раньше (потому что в этом нет необходимости), но я думаю, что использование рефлексии (в правильном направлении) - это лучший подход ...
Только для моего понимания - для чего это хорошо ? Возможно, есть другой способ (для вас) получить то, что вы хотите ...

Poornima Santhosh

Я разрабатываю SDK в .net., который используется для автоматической генерации запросов к базе данных. разработчик должен указать поля и таблицу базы данных, которые они используют для каждой формы, через мой пользовательский компонент. пользовательский компонент-это окно свойств. В фоновом режиме я создаю xml-файл для каждой формы, то есть для генерации запросов.

все это происходит во время проектирования.

один из моих технических руководителей имеет некоторое представление о том, что во время выполнения у меня есть кнопка сохранения в любой форме. В случае щелчка он должен вызвать InsertQueryGenerator и выполнить его автоматически, не имея оператора вызова в кнопке сохранения. Я думаю, что это невозможно сделать для toolstripbutton.

Ralf Meier

Привет,
мой пример взят из моего поставщика разрешений, который предоставляет дополнительные свойства элементам управления формы и дает разработчику возможность решить, какое разрешение необходимо для какого элемента управления-вы видите : это сопоставимое упражнение ...
Поэтому я думаю, что 1-я часть вашего последнего ответа должна быть легко осознана ...
2-я часть вашего ответа (часть с кнопкой сохранения) Я понял так : во время разработки кнопка не существует (почему бы и нет?), а во время выполнения она добавляется в форму (возможно, в зависимости от настройки свойств компонента). Если компонент добавляет кнопку сам по себе, то его события должно быть легко поймать. Но я не предпочитаю этот способ - я бы добавил его в форму во время разработки. Чтобы легко обнаружить эту кнопку (независимо от ее имени и текста), вы можете создать собственный тип кнопки (возможно, тип SaveButton, который непосредственно происходит от Button) и найти ее по типу в коллекции элементов управления формы.
Другим возможным способом для этого может быть : у вас есть свойство в вашем компоненте, в котором вы можете выбрать кнопки формы, и если здесь сделан выбор, то выбранная кнопка является вашей Кнопкой сохранения (из которой вы ловите события).
Часть вашего ответа с кнопкой Toolstrip я не понял - возможно, вы мне ее объясните.

Если одно из моих предложений вам интересно (и вам нужна дополнительная информация), пожалуйста, ответьте ...

Приятных вам выходных ...

Poornima Santhosh

Кнопка сохранения добавляется только во время разработки, а не во время выполнения.

Вот мой Xml-формат, который включает в себя все элементы управления формой, действия, которые нужно выполнить над каким событием, информацию о таблице БД с атрибутами и типом данных.

<?xml version="1.0" encoding="utf-8" ?>
- &ЛТ;FormXML префиксом xmlns:xsi в="http://www.w3.org/2001/XMLSchema-instance" префиксом xmlns:xsd-файл="http://www.w3.org/2001/XMLSchema" название="Form3"&ГТ;
- <список>
<имя элемента управления="label1" тип="Label" />
<имя элемента управления="lblEmployeeName" тип="Label" />
<имя управления="txtDesignation" тип="текстовое поле" /&ГТ;
<имя элемента управления="lblEmpAddress" тип="Label" />
<имя элемента управления="label2" тип="Label" />
<имя элемента управления="lblEmpCity" тип="Label" />
<имя элемента управления="cmbState" тип="ComboBox" />
<имя элемента управления="lblState" тип="Label" />
<имя элемента управления="comboBox1" тип="ComboBox" />
<Control Name="txtName" type="TextBox" />
<имя элемента управления="txtAddress" тип="TextBox" />
<Control Name="txtCity" type="TextBox" />
<имя элемента управления="btnClear" тип="кнопка" />
<имя элемента управления="btnDelete" тип="кнопка" />
<имя элемента управления="btnAdd" тип="кнопка" />
<имя элемента управления="txtTotal" тип="TextBox" />
<имя элемента управления="lblSalary" тип="Label" />
<имя элемента управления="label4" тип="Label" />
<имя управления="txtBasic" тип="текстовое поле" /&ГТ;
<имя элемента управления="txtESI" тип="TextBox" />
<имя элемента управления="label3" тип="Label" />
<имя элемента управления="lblESI" тип="Label" />
<имя элемента управления="txtPF" тип="TextBox" />

- <действия>
- <тип действия="сохранить">
- <Параметры>
&ЛТ;псевдоним атрибута="Exp0" выражение="сотрудник:имя:текст" /&ГТ;
<атрибут Alias="Exp1" выражение="сотрудник:обозначение:текст" />

- <список аргументов>
<аргумент ControlObject="TextBox:txtName" событие="Click" />
&ЛТ;ControlObject аргумент="текстовое поле:txtDesignation" событие="очередь textchanged" /&ГТ;

- <таблицы>
работник





Используя этот XmL, я создал InsertQuery. У меня есть отдельный класс для автоматического создания запроса.

Poornima Santhosh

Я не знаю, как использовать EventHandlers. Я должен вызвать соответствующие события в xml с помощью обработчиков событий

1 Ответов

Рейтинг:
5

Ralf Meier

Вот код в VB, который позволяет компоненту обнаружить свою родительскую форму (во время разработки).

Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Runtime.CompilerServices


сам компонент реализует ISupportInitialize
Implements ISupportInitialize

    Public Sub BeginInit() Implements ISupportInitialize.BeginInit
    End Sub

    Public Sub EndInit() Implements ISupportInitialize.EndInit
        GetParentForm()
    End Sub


#Region "Detect the ParentForm"
 
    Private Sub GetParentForm()
        Dim myHost As IDesignerHost = Nothing
        If MyBase.Site IsNot Nothing Then myHost = CType(MyBase.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
        If myHost IsNot Nothing Then
            myParentForm = CType(myHost.RootComponent, Form)
            Exit Sub
        End If
    End Sub

    Public Overrides Property Site() As System.ComponentModel.ISite
        Get
            Return MyBase.Site
        End Get
        Set(ByVal value As System.ComponentModel.ISite)
            MyBase.Site = value
            GetParentForm()
        End Set
    End Property

    <Category("Info-Data"), Description("the Parentform of the Component")>
    Property ParentForm() As Form
        Get
            Return myParentForm
        End Get
        Set(value As Form)
            myParentForm = value
        End Set
    End Property
    Private WithEvents myParentForm As Form

#End Region