Как использовать строки из XML в качестве переменной для создания кнопки?C # - PullRequest
1 голос
/ 10 мая 2019

Чтобы сделать это проще, я покажу свой код, а затем объясню, что я пытаюсь сделать.

КОД + ОБЪЯСНЕНИЕ:
Сначала, когда пользователь нажимает кнопкуон идет к Other с дополнительной информацией.

private void button1_Click(object sender, EventArgs e)
    => Other("https://pastebin.com/raw/something", "Program1", "A");

private void button2_Click(object sender, EventArgs e)
    => Other("https://pastebin.com/raw/something", "Program2", "B");

Во-вторых, я загружаю XML-документ и извлекаю из него необходимую информацию:

private void Other(string UniversalURL, string ProductNAME, string ProductCHANNEL)
    {
        //Download the Doc

        XmlDocument document = new XmlDocument();
        document.Load(UniversalURL);
        string expandedEnvString = Environment.ExpandEnvironmentVariables("%USERPROFILE%/AppData/Local/Temp/zADU.xml");
        File.WriteAllText(expandedEnvString, document.InnerXml);
        XmlDocument doc = new XmlDocument();
        doc.Load(expandedEnvString);

        //Get the needed Nodes

        XmlNode nodeXMLProgram = doc.DocumentElement.SelectSingleNode($"/{ProductNAME}");
        string XMLProgram = nodeXMLProgram.InnerText;

        // Creation of Button Here
    }

ЦЕЛЬ: То, что я хочу сделать, это использовать строки, извлеченные из XML, и использовать их в качестве переменных при создании кнопки, вроде этого:

Button Program(XMLProgram) = new Button();
Program(XMLProgram).Height = 22;
Program(XMLProgram).Width = 122;
Program(XMLProgram).BackColor = Color.FromArgb(230, 230, 230);
Program(XMLProgram).ForeColor = Color.Black;
Program(XMLProgram).Name = "DynamicButton";
Program(XMLProgram).Click += new EventHandler(ProgramProgram(XMLProgram)_Click);
Program(XMLProgram).BringToFront();
Controls.Add(ProgramProgram(XMLProgram));

Смогу ли я сделать это?Помощь будет оценена! Извините, что запутал название, я не знаю, как правильно его сформулировать.

1 Ответ

0 голосов
/ 10 мая 2019

Вы можете использовать Reflection для поиска и установки свойств объекта, который вы десериализует автоматически, при условии, что у вас есть правильно отформатированный файл XML.

Прочитайте ваш XML-файл через XDocument или XmlDocument, извлеките из него тип элемента управления, который вам нужно создать (кнопка, текстовое поле и т. Д.), А также извлеките имена свойств, которые нужно установить из XML, и значения, чтобы установить их. Затем создайте экземпляр указанного типа элемента управления и используйте такой код для просмотра списка свойств из XML и установки их в своем экземпляре:

        // New instance of the control (read the type from the XML and create accordingly)
        var ctrlInstance = new Button();

        // Get a reference to the type of the control created.
        var ctrlType = ctrlInstance.GetType();

        // Dictionary to contain property names and values to set (read from XML)
        var properties = new Dictionary<string, object>();

        foreach (var xmlProp in properties)
        {
            // Get a reference to the actual property in the type
            var prop = ctrlType.GetProperty(xmlProp.Key);
            if (prop != null && prop.CanWrite)
            {
                // If the property is writable set its value on the instance you created
                // Note that you have to make sure the value is of the correct type
                prop.SetValue(ctrlInstance, xmlProp.Value, null);
            }
        }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...