Я пытаюсь написать метод, который берет файл xml.config из некоторого места в файловой системе с помощью кнопки «Загрузить», анализирует его и после этого работает с определенными строками в типах атрибутов элемента и mapTo, получая некоторые подстроки из этих атрибутов. Проблема в том, что вместо строк в таблице я получаю несколько строк. Кто-нибудь знает, в чем может быть проблема?

Вызов кнопки и метода выглядит так:

private void button1_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog fDialog = new OpenFileDialog();

            fDialog.Title = "Open XML file";
            fDialog.Filter = "XML files|*.config";
            fDialog.InitialDirectory = @"C:\";

            bool? control = fDialog.ShowDialog();
            if (control.Value)
            {
                var filePath = fDialog.FileName;
                ReadAdvancedConfigFile(filePath);
            }

        }

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

private void ReadAdvancedConfigFile(string path)
{
    XElement root = null;
    root = XElement.Load(new XmlTextReader(path));

    if (root != null)
    {
        XNamespace ns = "http://schemas.microsoft.com/practices/2010/unity";
        var registers = root.Element(ns + "unity").Element(ns + "container").Descendants(ns + "register");

        if (registers.Count() > 0)
            {
            var tipList = registers.Select(x => x.Attribute("type").Value);
            var mapToList = registers.Select(x => x.Attribute("mapTo").Value);
            List<string> listresult = new List<string>();
            List<string> listresultm = new List<string>();

                foreach (string tpl in tipList)
                {
                    int end = tpl.IndexOf(',');
                    int start = tpl.LastIndexOf('.', (end == -1 ? tpl.Length - 1 : end)) + 1;
                    string result = tpl.Substring(start, (end == -1 ? tpl.Length : end) - start);
                    listresult.Add(result);
                }
                foreach (string mpl in mapToList)
                {
                    int endm = mpl.IndexOf(',');
                    int startm = mpl.LastIndexOf('.', (endm == -1 ? mpl.Length - 1 : endm)) + 1;
                    string resultm = mpl.Substring(startm, (endm == -1 ? mpl.Length : endm) - startm);
                    listresultm.Add(resultm);
                }

                int maxLenList = Math.Max(listresult.Count, listresultm.Count);
                for (int i = 0; i < maxLenList; i++)
                {
                    if (i < listresult.Count && i < listresultm.Count)
                    {
                        _obsCollection.Add(new Tuple<string, string>(listresult[i], listresultm[i]));
                    }
                    else if (i >= listresult.Count)
                    {
                        _obsCollection.Add(new Tuple<string, string>(string.Empty, listresultm[i]));
                    }
                    else if (i >= listresultm.Count)
                    {
                        _obsCollection.Add(new Tuple<string, string>(listresultm[i], string.Empty));
                    }
                }
            tabela.ItemsSource = _obsCollection;
        }
    }
} 

Содержимое файла XML.config выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
    </configSections>

    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

        <container name="container">

            <register name="configService" type="Web.Common.Interfaces.IConfigService, Web.Common"
                      mapTo="Web.Common.Services.ConfigServiceImpl, Web.Common">
                <lifetime type="singleton" />
                <constructor>
                    <param name="res" value="Resources.ClientStrings"> </param>
                    <param name="configFile" value="webclient.config"> </param>
                </constructor>
                <!--<property name="LocalisationService" dependencyName="LocalisationService" />-->
                <!--This is a property injection from the language plugin -->
            </register>

            <register name="scaleCoefConfigService" type="Web.WebClient.Services.IScaleCoefConfigService, Web.WebClient.TDMSWebApp"
                      mapTo="Web.WebClient.Services.Implementations.ScaleCoefConfigServiceImpl, Web.WebClient.TDMSWebApp">
                <lifetime type="singleton" />
                <constructor>
                    <param name="configService">
                        <dependency name="configService"/>
                    </param>
                </constructor>
            </register>

            <register name="sessionService" type="Web.Common.Interfaces.ISessionService, Web.Common" 
                      mapTo="Web.Common.Services.SessionServiceImpl, Web.Common">
                <lifetime type="singleton" />
            </register>

            <register name="licenseManagerService" type="Web.Common.Interfaces.ILicenseManagementService, Web.Common"
                      mapTo="Web.Common.Services.LicenseManagementServiceImpl, Web.Common">
                <lifetime type="singleton" />
            </register>
        </container>
    </unity>
</configuration>

Вот как я создал кортеж для пары строк. В этом классе также есть определение для метода ReadAdvancedConfigFile и, конечно же, кнопки загрузки:

    public partial class CreateAreaDialogWindow : System.Windows.Window
        {
            ObservableCollection<Tuple<string, string>> _obsCollection = new ObservableCollection<Tuple<string, string>>();

            public CreateAreaDialogWindow()
            {
                InitializeComponent();
            }
}

Код XAML для datagrid следующий:

<DataGrid AutoGenerateColumns="False" Height="146" HorizontalAlignment="Left" Margin="34,275,0,0" Name="tabela" VerticalAlignment="Top" Width="384" SelectionChanged="tabela_SelectionChanged" />

Надеюсь, я не усложнил это слишком сложно.

0
nemo_87 5 Фев 2014 в 13:13
Можете добавить скриншот проблемы. Мне не все ясно.
 – 
Patrick Hofman
5 Фев 2014 в 13:16
Скриншот датагрида со строками? Или что-то другое?
 – 
nemo_87
5 Фев 2014 в 13:19
Да, я имел в виду именно это.
 – 
Patrick Hofman
5 Фев 2014 в 13:25
Картинку присылать почему-то не буду ... Буду и дальше пробовать. Но это, по сути, окно с одной кнопкой «Загрузить» и расположенной под ней DataGrid. В DataGrid у меня есть строки вместо строк в двух столбцах. Я думаю, что проблема может быть в этой строке: tabela.ItemsSource = _obsCollection; Потому что я не уверен, может ли ItemsSource так работать?
 – 
nemo_87
5 Фев 2014 в 13:32
Я понял. Я сам видел проблему, но это было легче определить по изображению. Не беспокойся об этом больше. Смотрите мой ответ.
 – 
Patrick Hofman
5 Фев 2014 в 13:32

1 ответ

Лучший ответ