Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGrid и DataTable 
:(
    Опции темы
WOoHOo
Дата 7.8.2014, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 30.11.2010

Репутация: нет
Всего: нет



Ребята, помогите разобраться!
Есть удаленный сервер, на нем я вызываю хранимую процедуру. Получаю данные и пытаюсь поместить их в datagrid. 

Код

 private void datagrid_on_Loaded(object sender, RoutedEventArgs e)
        {
            OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();
            builder["dsn"] = "spravka";
            builder["uid"] = "user";
            builder["pwd"] = "pass";

            using (OdbcConnection con = new OdbcConnection(builder.ToString()))
            {
                try
                {
                    // Команда выполнения хранимой процедуры
                    OdbcCommand cmd = new OdbcCommand();
                    cmd.Connection = con;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.CommandText = " OBJECTs 'ON'";

                    // Хранение данных
                    DataSet ds = new DataSet();
                    ds.DataSetName = "Objects";
                    DataTable dt_ObjectOn = new DataTable();
                    dt_ObjectOn.TableName = "ObjectOn";
                    ds.Tables.Add(dt_ObjectOn);

                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    int i = da.Fill(ds.Tables["ObjectOn"]);
                    datagrid_on.DataContext = dt_ObjOn.DefaultView;
                    label_count_on.Content = "Количество объектов: " + i.ToString();
                }
                catch (Exception ex) // OdbcException 
                {
                    MessageBox.Show("НЕ Получилось!!");
                    MessageBox.Show(ex.Message.ToString());
                }
                finally { con.Close(); }
            }
        }
    }


Привязка к таблице:
Код

 <DataGrid  AutoGenerateColumns="False" CanUserSortColumns="True" SelectionMode="Extended" SelectionUnit="CellOrRowHeader" x:Name="datagrid_on" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="456" Width="742" Loaded="datagrid_on_Loaded">
                        <DataGrid.Columns>
                            <DataGridTextColumn x:Name="Date_Start" Binding="{Binding Path=datapost}" Header="Дата" Width="Auto"/>
                            <DataGridTextColumn x:Name="Cypher" Binding="{Binding Path=NAMEobj}" Header="Шифр" Width="Auto" />
                            <DataGridTextColumn x:Name="Object" Binding="{Binding Path=objekt}" Header="Объект" Width="Auto" />
                        </DataGrid.Columns>
                    </DataGrid>


Теперь вопросы:
1) Не работает заполнение DataTable (таблица в ds присутствует, кол-во 1 после добавления)
Ни так 
  int i = da.Fill(ds.Tables[0]);
 datagrid_on.ItemsSource = ds.Tables[0].DefaultView;
Ни так 
 int i = da.Fill(ds.Tables["ObjectsOn"]);
datagrid_on.DataContext = dt_ObjOn.DefaultView;

Можно, конечно, заполнять просто DataSet () -   int i = da.Fill(ds); - и при таком раскладе все работает, но в нем должно быть несколько datatable и необходимо заполнять конкретную. Как это сделать? Почему не работает? 

2) При удачном выводе данных в таблицу они выводятся примерно так:
21.12.12 22:00  | Алевтина | Ушла с работы
21.12.12 22:30  | Георгий   | Пришел на работу
21.12.12 21:40  | Георгий   | Пришел на работу
21.12.12 21:45  | Алевтина | Ушла с работы

Т.е. данные почему-то располагаются не в том порядке (по времени) как должно быть... Даже при сортировке по убыванию.. Хотя в access приложении (которое переписываю) все правильно отображается

3) При удачном заполнении datatable, есть столбец и в нем содержатся данные формата 30.01.12 22:00:00 (datapost).
Есть необходимость разделить дату и время и вывести их в различные столбцы datagrid. Я это делаю так:
Код

 <DataGridTextColumn x:Name="Date_Start" Binding="{Binding Path=datapost, StringFormat={}{0:dd.MM.yy}}" Header="Дата постановки" Width="Auto"/>
 <DataGridTextColumn x:Name="Time_Start" Binding="{Binding Path=datapost, StringFormat={}{0:HH:MM:ss}}" Header="Время" Width="Auto" />-->

В планах прикрутить группировку строк по дате. Я правильно понимаю что группировка идет по столбцу datagrid (Date_Start), а не datatable (datapost) и нет необходимости добавлять в datatable еще один столбец чисто под дату?

PM MAIL   Вверх
Ilya81
Дата 7.8.2014, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

Репутация: 1
Всего: 4



DataContext - это объект с соответствующими свойствами, а не view в базе данных. Во-первых, у DataGrid надо задать ItemsSource, он должен быть типа IEnumerable. Если уж нужно предельно упростить, то лучше взять свойство Rows, ибо оно является коллекцией. А столбцы bind'ить на элементы свойства Item, поскольку DataContext будет DataRow и у него есть такое свойство.
PM MAIL ICQ Skype   Вверх
WOoHOo
Дата 9.8.2014, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 30.11.2010

Репутация: нет
Всего: нет



Пункт 2 (вопрос про время) - решено. Накосячил с выводом. Было {0:HH:MM:ss}, стало {0:HH:mm:ss}.

Вернемся к пункту 1. Заполнение datatable и привязка к datagrid

Вот так не работает:
Код

DataTable dt = new DataTable();
                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    int i = da.Fill(dt);
                    datagrid_on.ItemsSource = dt.DefaultView;
                    label_count_on.Content = "Количество объектов: " + i.ToString();

DataSet ds = new DataSet();
                    DataTable dt = new DataTable();
                    dt.TableName = "ObjectOn";
                    ds.Tables.Add(dt);
                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    int i = da.Fill(ds.Tables["ObjectOn"]);
                    datagrid_on.ItemsSource = ds.Tables["ObjectOn"].DefaultView;
                    label_count_on.Content = "Количество объектов: " + i.ToString();

DataSet ds = new DataSet();
                      DataTable dt = new DataTable();
                      dt.TableName = "ObjectOn";
                      ds.Tables.Add(dt);
                      OdbcDataAdapter da = new OdbcDataAdapter();
                      da.SelectCommand = cmd;
                      int i = da.Fill(ds.Tables[0]);
                      datagrid_on.ItemsSource = ds.Tables[0].DefaultView;
                      label_count_on.Content = "Количество объектов: " + i.ToString();


А вот так работает:
Код

1.
 DataSet ds = new DataSet();
                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    int i = da.Fill(ds);
                    datagrid_on.ItemsSource = ds.Tables[0].DefaultView;
                    label_count_on.Content = "Количество объектов: " + i.ToString();
2.
                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    DataSet ds = new DataSet();
                    da.Fill(ds, "ObjectOn");
                    datagrid_on.ItemsSource = ds.Tables["ObjectOn"].DefaultView;
3.
                    DataSet ds = new DataSet();
                    DataTable dt = new DataTable();
                    dt.TableName = "ObjectOn";
                    ds.Tables.Add(dt);
                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    int i = da.Fill(ds, "ObjectOn");
                    datagrid_on.ItemsSource = ds.Tables["ObjectOn"].DefaultView;
                    label_count_on.Content = "Количество объектов: " + i.ToString();



Почему если делать заливку данных, используя dataset, все получается, а если чисто datatable, то нет? Хотя метод dataadapter.Fill принимает параметр DataTable... Т.е. все должно работать и без DataSet..

Т.е. хочу получить код вида:
Код

                   DataTable dt = new DataTable();
                    OdbcDataAdapter da = new OdbcDataAdapter();
                    da.SelectCommand = cmd;
                    int i = da.Fill(dt);
                    datagrid_on.ItemsSource = dt.DefaultView;
                    label_count_on.Content = "Количество объектов: " + i.ToString();

НО в i = 0. Почему так? :(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.