AAB40 Ответов: 2

Как получить содержимое прочитанного XML-файла в текстовом поле второй формы?


Привет Кто-То,
У меня нет "System.Xml.XmlDocument "или" System.Xml.XmlReader " в моих возможностях использования системы. Есть ли что-то, что я должен сделать, чтобы добавить их, пожалуйста? И как мне это сделать? Я скачал бесплатную версию Visual Studio free Community 2015. Единственное, что в ней находятся "через System.Xml" и "через систему.В LINQ". Но я не могу работать с Linq. Для меня это в новинку. Кроме того, прошло уже 5 лет с тех пор, как я больше не кодирую, так что я очень заржавел.
Тем не менее, я хотел добавить содержимое выбранного XML-файла в текстовое поле на второй форме, чтобы пользователь мог отредактировать этот файл и сохранить его впоследствии.
Есть ли кто-нибудь, кто мог бы мне помочь, пожалуйста? Потому что единственное, что происходит, - это пользователь может перейти к папке на своем жестком диске, выбрать папку со всеми XML-файлами. Затем он имеет обзор всех файлов в первом текстовом поле и может выбрать один файл для открытия там, где открывается вторая форма, но без текстового поля!? Так что на самом деле мне не хватает моего второго текстового поля и xml-содержимого.

Заранее спасибо.

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

public partial class Form1 : Form
    {
        //get files from directory
        string[] path = Directory.GetFiles(@"C:\Users\decraiec\Documents\Atrias_Automated", "*.XML");


        public Form1()
        {
            InitializeComponent();
            listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged;
        }

        private void btnGetFiles_Click(object sender, EventArgs e)
        {
            //read all files in path
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            if (fbd.ShowDialog() == DialogResult.OK)
            {
                //if there is text in the listbox clear it first
                listBox1.Items.Clear();
                //create an array for the files and the directory.
                string[] files = Directory.GetFiles(fbd.SelectedPath);
                string[] dirs = Directory.GetDirectories(fbd.SelectedPath);
                //show every file in the listbox
                foreach (string file in files)
                {
                    listBox1.Items.Add(file);
                }
                foreach (string dir in dirs)
                {
                    listBox1.Items.Add(dir);
                }
            }
        }

        public void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            string currentItem = listBox1.SelectedItem.ToString();
            if (listBox1.SelectedIndex == -1)
            {
                MessageBox.Show("Item is not available in Listbox");
            }
            else
            {

                //read the file and give it back in the second form in the listbox
                var xmlString = File.ReadAllText(currentItem.ToString());
                var stringReader = new StringReader(xmlString);
                var dsSet = new DataSet();
                dsSet.ReadXml(stringReader);

                //show second form with listbox on it and the clicked xml file content
                frmEditXML frm2 = new frmEditXML();
                TextBox txb2 = new TextBox();
                txb2.Text = dsSet.GetXml();
                txb2.Text = dsSet.GetXmlSchema();
                frm2.ShowDialog();
                txb2.Show();

            }
        }



        private void Form1_Load(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }

public partial class frmEditXML : Form
   {


       private void frmEditXML_Load(object sender, EventArgs e)
       {
              //open textfile and show content that was selected
       }



       private void btnSaveChanges_Click(object sender, EventArgs e)
       {
           //Text from the richtextbox
           string strsave = tbxSaveChanges.Text;
           //Create a new SaveFileDialog object
           using (SaveFileDialog sfdSave = new SaveFileDialog())
               try
               {
                   //Available file extension
                   sfdSave.Filter = "XML (*.xml*)|*.xml*";
                   //Show SaveFileDialog
                   if (sfdSave.ShowDialog() == DialogResult.OK && sfdSave.FileName.Length > 0)
                   {
                       //save file as xml
                       UTF8Encoding utf8 = new UTF8Encoding();
                       StreamWriter sw = new System.IO.StreamWriter(sfdSave.FileName, false, utf8);
                       sw.Write(strsave + " - NEG");
                       sw.Close();
                   }
               }
               catch (Exception errorMsg)
               {
                   MessageBox.Show(errorMsg.Message);
               }
           Application.Exit();
       }

       private void frmEditXML_FormClosed(object sender, FormClosedEventArgs e)
       {
           Application.Exit();
       }

   }

ZurdoDev

Щелкните правой кнопкой мыши свой проект и добавьте ссылку на него. System.Xml. Тогда они проявятся в вашем использовании.

AAB40

Привет, Ряндев, спасибо, но я уже пробовал это сделать, и список ссылок, которые мы можем добавить, очень длинный без каких-либо других добавок "xml". единственное, что там есть, - это то, что у меня уже есть: "использование System.Xml;". Но тем не менее, если я буду следовать образу мыслей Ричарда, мне это больше не понадобится (я думаю). Спасибо, что ответили.

2 Ответов

Рейтинг:
6

AAB40

Работайте так, как предложил Ричард Маккатчан: я использовал 1 кнопку, чтобы получить файл, и 1 кнопку, чтобы сохранить изменения.

public partial class frmEditXML : Form
{
    //get files from directory
    string[] path = Directory.GetFiles(@"C:\Users\decraiec\Documents\Atrias_Automated", "*.XML");


    public frmEditXML()
    {
        InitializeComponent();

    }



    private void btnEditfile_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            richTextBox1.Text = openFileDialog1.FileName;
            File.ReadAllText(richTextBox1.Text);
        }
        openFileDialog1.Filter = "xml files|*.xml|All files|*.*";
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            try
            {
                richTextBox1.LoadFile(openFileDialog1.FileName, RichTextBoxStreamType.PlainText);
            }
            catch (Exception exc)
            {
                MessageBox.Show("An error occured: " + System.Environment.NewLine + exc.ToString() + System.Environment.NewLine);
                throw;
            }
        }

    }

    private void frmOpenRead_Load(object sender, EventArgs e)
    {
        Application.Exit();
    }

    private void btnSavechanges_Click(object sender, EventArgs e)
    {
        if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            File.WriteAllText(saveFileDialog1.FileName, richTextBox1.Text);
        }
    }
}


AAB40

Почему этот был удален, пожалуйста? У меня была проблема, кто-то помог мне, и я нашел решение.....! ???

Рейтинг:
18

Richard MacCutchan

Вы могли бы упростить ситуацию, просто имея элемент управления редактированием в вашей основной форме, который позволяет пользователю выполнять редактирование. И вместо списка для выбора файла используйте Класс OpenFileDialog (System.Окна.Формы)[^].

Кроме того, если вы хотите использовать Класс XmlDocument (System.Xml)[^] тогда вам просто нужно System.Xml в вашем справочном наборе.


AAB40

Спасибо тебе, Ричард, за такой быстрый ответ. Но как вы предлагаете это сделать? Как пользователю нужно выбрать конкретный файл из списка, прежде чем редактировать его? это 2 действия вместо 1. Выделите файл курсором и нажмите кнопку "Изменить". "BtnGetFiles_Click" показывает только список всех файлов, извлеченных из основной папки....

Richard MacCutchan

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

AAB40

спасибо Ричарду, это была самая легкая часть, используя OpenFileDialog. Но это просто написание заголовка, который пользователь выбирает в richTextBox, а не отображение XML-содержимого. Поэтому мне нужно что-то вроде считывателя для xml-файла. Итак, во-первых, куда я должен поместить код? внутри петли if или снаружи? во-вторых, у меня нет конкретных узлов, которые я хочу изменить на данный момент, это просто чтение XML-файла и полное отображение его в текстовом поле.

AAB40

Ричард, я нашла дорогу. Спасибо, что уделили мне время.