Отобразите файл .exe.config в сетке данных и измените настройки - PullRequest
6 голосов
/ 30 мая 2011

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

Я пытался объявить набор данных и изначально думал, что файл .exe.config был просто файлом XML, но этот код не работает:

        dataSet1.ReadXml(configpath);
        bindingSource1.DataSource = dataSet1.Tables[0];
        dataGridView1.DataSource = bindingSource1;

Когда я запустил его, datagridview было пустым, и я подтвердил, что путь к файлу был правильным, и при отладке кода не было никаких исключений, тогда как для других XML-файлов, которые я открываю в графическом интерфейсе, все отлично работает с отображаемыми данными. Может быть, readxml () поддерживает только легальные xml-файлы, а не xml-файлы конфигурации? Я попытался поискать в Google и искать ответы на некоторые вопросы, но все, что я получил, были темы, связанные с изменением настроек путем ручного доступа к файлу XML и изменения значений (вещи, которые я уже знаю). Я хочу, чтобы пользователь мог делать то, что он хочет делать с данными, а затем сохранять их. Настройки .exe.config могут быть такими же, как и для другой программы, но по сути это файл конфигурации xml. Я полагал, что в этой сети не так много проблем, связанных с этой конкретной проблемой, потому что настройки, как правило, статичны, и если их изменить, это довольно легко сделать вручную.

Подводя итог,

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

Любая помощь приветствуется. Заранее спасибо!

  • tf.rz (.NET 3.5 SP1, Visual Studio 2008 C #)

РЕДАКТИРОВАТЬ: я загружу рабочий пример созданного мною файла xml: я хочу, чтобы программа могла перейти к файлу .exe.config, затем открыть его и отобразить так, где указаны названия параметров столбцы и значения находятся в ячейках таблицы данных. К сожалению, я не на своем домашнем компьютере, чтобы сделать это.

1 Ответ

2 голосов
/ 01 июня 2011

Это то, что я использовал для загрузки и управления файлом конфигурации.Вы можете изменить методы loadAppSettings и loadConnStrings в соответствии с вашими потребностями.

using System;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;


namespace GenericManagementClasses
{
    public class ConfigFile
    {
        private string m_ConfigFilePath;
        private XmlDocument m_XmlDoc;

        private FileStream fIn;
        private StreamReader sr;
        private StreamWriter sw;

        private OrderedDictionary m_AppSettings;
        private OrderedDictionary m_ConnectionStrings;

        private XmlNode m_AppSettingsNode;
        private XmlNode m_ConnectionStringsNode;

        #region "Properties"
        public String Path
        {
            get
            {
                return m_ConfigFilePath;
            }
        }

        public OrderedDictionary AppSettings
        {
            get
            {
                return m_AppSettings;
            }
        }

        public OrderedDictionary ConnectionStrings
        {
            get
            {
                return m_ConnectionStrings;
            }
        }
        #endregion
        #region "Constructors"
        /// <summary>
        /// Default constructor - declared private so that you can't instantiate an empty ConfigFile object
        /// <code>ConfigFile cfg = new ConfigFile()</code> will result in a NotImplemented exception
        /// </summary>
        private ConfigFile()
        {
            throw new NotImplementedException("No default constructor for the ConfigFile class");
        }
        /// <summary>
        /// Public constructor
        /// <example>ConfigFile cfg = new ConfigFile(@"c:\MyApp\MyApp.exe.config");</example>
        /// </summary>
        /// <param name="ConfigFilePath">The path to the configuration file</param>
        public ConfigFile(string ConfigFilePath)
        {
            //Check to see if the file exists
            if (File.Exists(ConfigFilePath)){
                //Initialise the XmlDocument to hold the config file
                m_XmlDoc = new XmlDocument();
                //Store the path to the config file
                m_ConfigFilePath = ConfigFilePath;

                //FileStream to get the contents out of the file
                fIn = new FileStream(m_ConfigFilePath, FileMode.Open, FileAccess.ReadWrite);
                //StreamReader to read the FileStream
                sr = new StreamReader(fIn);
                //StreamWriter to write to the FileStream
                sw = new StreamWriter(fIn);

                //Try and load the XML from the file stream
                try
                {
                    m_XmlDoc.LoadXml(sr.ReadToEnd());
                    m_AppSettingsNode = m_XmlDoc.GetElementsByTagName("appSettings")[0];
                    m_ConnectionStringsNode = m_XmlDoc.GetElementsByTagName("connectionStrings")[0];

                    loadAppSettings();
                    loadConnStrings();

                }
                catch (Exception ex)
                {
                    //If it went pear shaped, throw the exception upwards
                    throw ex;
                }

            }
            else
            //If the file doesn't exist, throw a FileNotFound exception
            {
                throw new FileNotFoundException(ConfigFilePath + " does not exist");
            }
        }
        #endregion

        private void loadAppSettings()
        {
            m_AppSettings = new OrderedDictionary();
            XmlNodeList nl = m_AppSettingsNode.SelectNodes("add");
            foreach (XmlNode node in nl)
            {
                m_AppSettings.Add(node.Attributes["key"].Value, node.Attributes["value"].Value);
            }
        }

        private void loadConnStrings()
        {
            m_ConnectionStrings = new OrderedDictionary();

            XmlNodeList nl = m_ConnectionStringsNode.SelectNodes("add");
            foreach (XmlNode node in nl)
            {
                m_ConnectionStrings.Add(node.Attributes["name"].Value, node.Attributes["connectionString"].Value);
            }
        }

        public void setAppSetting(string name, string newValue)
        {
            if (!m_AppSettings.Contains(name))
            {
                throw new Exception(String.Format("Setting {0} does not exist in {1}", name, m_ConfigFilePath));
            }
            else
            {
                m_AppSettings[name] = newValue;
                m_XmlDoc.SelectSingleNode(String.Format(@"//appSettings/add[@key='{0}']",name)).Attributes["value"].Value = newValue;
                fIn.SetLength(0);
                sw.Write(m_XmlDoc.InnerXml);
                sw.Flush();
            }

        }
        #region "Static Methods"
        /// <summary>
        /// Static method to return a ConfigFile object
        /// <example>ConfigFile cfg = ConfigFile.LoadConfigFile(@c:\MyApp\MyApp.exe.config");"</example>
        /// </summary>
        /// <param name="ConfigFilePath">Path to the configuration file to load</param>
        /// <returns></returns>
        public static ConfigFile LoadConfigFile(string ConfigFilePath)
        {
            return new ConfigFile(ConfigFilePath);
        }
        #endregion
    }
}
...