Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2012, 08:13   #1
CrFrog
 
Регистрация: 13.09.2012
Сообщений: 3
По умолчанию ЧтениеXML в datagrid

Доброго времени суток.
есть xml файлы полученные из бд (oracle,
Код:
select dbms_xmlgen.getxml('#sql#') xmldata from dual;
)
на выходе получается xml файл. #sql# может быть любым, поэтому заранее не известно как будут называться поля и сколько их вернется, пример:
Код HTML:
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <ID>3548006</ID>
  <R_TYPE>2</R_TYPE>
  <NAME>пристройка</NAME>
  <ADR_ID>9994006</ADR_ID>
  <ADR_DESC>с. Кирба</ADR_DESC>
  <ADR_PRN_DESC>с. Кирба</ADR_PRN_DESC>
 </ROW>
 <ROW>
  <ID>8651006</ID>
  <R_TYPE>3</R_TYPE>
  <NAME>Квартира</NAME>
  <ADR_ID>12691006</ADR_ID>
  <ADR_DESC>с.Табат</ADR_DESC>
  <ADR_PRN_DESC>с.Табат</ADR_PRN_DESC>
 </ROW>
</ROWSET>
необходимо вывести эти данные в datagrid с возможностью прочитать выделенную строчку
пока вижу такой выход:
создать класс
Код:
     public class XmlRowData 
    {
        public IDictionary<string, string> Row;
        public XmlRowData()
        {
            Row = new Dictionary<string, string>();
        }
    }
а в коде создать списки
Код:
 public ObservableCollection<XmlRowData> xmlData { set; get; }
 public ObservableCollection<string> xmlCols { set; get; }
Функцию чтения сделал так:
Код:
public void ReadXML(string filename)
{
  XmlTextReader reader = new XmlTextReader(filename);
  bool isXMLRowset = false;
  bool isXMLRow = false;
  string sColName = "";
  int curCol = -1;
  while (reader.Read())
  {
  if (reader.NodeType == XmlNodeType.Element) //Если элемент 
  {
    if (reader.Name == "ROWSET")
    {
    isXMLRowset = true;
    continue;
   }
    if (isXMLRowset && reader.Name == "ROW")
   {
    isXMLRow = true;
    xmlData.Add(new XmlRowData());
    continue;
    }
    if (isXMLRowset && isXMLRow)
    {
    isXMLRow = true;
    sColName = reader.Name;
    curCol = xmlCols.IndexOf(sColName);
    if (curCol == -1)
    {
    xmlCols.Add(sColName);
    curCol = xmlCols.Count - 1;
    }
   }
  }
  if (reader.NodeType == XmlNodeType.Text) //Если элемент
  {
    if (isXMLRowset && isXMLRow && sColName != "")
    {
    xmlData[xmlData.Count - 1].Row.Add(sColName, reader.Value);
    }
  }
  if (reader.NodeType == XmlNodeType.EndElement) //Если элемент 
  {
    if (reader.Name == "ROWSET")
    {
    isXMLRowset = false;
    }
    if (isXMLRowset && reader.Name == "ROW")
    {
    isXMLRow = false;
    }
    if (isXMLRowset && isXMLRow && sColName != "")
    {
    sColName = "";
    }
  }
  }
  reader.Close();
}
на форме имеется telerik:RadGridView (для этого примера идеология как у DataGrid)
Код HTML:
<telerik:RadGridView x:Name="dgTable" Margin="0,0,0,10" Grid.Row="1" >
</telerik:RadGridView>   
пытаюсь связать с данными
Код:
filename = dlg.FileName;
ReadXML(filename);
dgTable.Columns.Clear();
foreach (string sCol in xmlCols)
{
 GridViewDataColumn newColumn = new GridViewDataColumn();
 newColumn.DataMemberBinding = new Binding("Values"); //Причина зарыта тут
 newColumn.UniqueName = sCol + this.dgTable.Columns.Count.ToString();
 newColumn.Name = sCol + this.dgTable.Columns.Count.ToString();
 newColumn.Header = sCol;
 dgTable.Columns.Add(newColumn);
}
dgTable.ItemsSource = xmlData;
данные в xmlData попали успешно:

Внимание вопрос!!
вопрос 1 - важный: что нужно указать Binding в строке
Код:
 newColumn.DataMemberBinding = new Binding("Values"); //Причина зарыта тут
чтобы отобразилось содержимое
вопрос 2 - риторический: есть ли способ проще прочитать xml
CrFrog вне форума Ответить с цитированием
Старый 25.09.2012, 13:34   #2
CrFrog
 
Регистрация: 13.09.2012
Сообщений: 3
По умолчанию

На второй вопрос (как сделать проще) нашел ответ:
Код:
using System.Data;
...
var xmlDataSet = new DataSet();
xmlDataSet.ReadXml(filename);
dgTable.ItemsSource = xmlDataSet;
dgTable.Rebind();
но все таки хотелось бы разобраться с биндингом, если упростить вопрос, то будет звучать так:
у нас имеется класс
Код:
public class XmlRowData 
{
  public Dictionary<string, string> Row;
  
  public XmlRowData()
  {
     Row = new Dictionary<string, string>();
  }
}
и имеется список
Код:
xmlData = new ObservableCollection<XmlRowData>();
как отобразить содержимое списка в DataGrid или ListBox??
CrFrog вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение из datagrid varelik Visual C++ 1 10.08.2012 14:08
2 DataGrid на форме Abbath1349 WPF, UWP, WinRT, XAML 2 19.01.2012 09:55
вывод в datagrid wm_leviathan Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 0 28.11.2011 16:31
Поиск в DataGrid Mixim WPF, UWP, WinRT, XAML 0 21.09.2011 15:37
DataGrid C# Dizell Общие вопросы .NET 2 22.07.2010 16:59