powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как в DataGrid показать данные, собранные из разных DataTable?
12 сообщений из 12, страница 1 из 1
Как в DataGrid показать данные, собранные из разных DataTable?
    #32623930
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть DataSet. В нем несколько таблиц. Надо в одном DataGrid(ASP.NET) показать что-то типа T-SQL view, т.е. неск-ко колонок из одной таблицы, неск-ко из родительской. Как это лучше всего сделать?
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32624113
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно использовать свойство Expression у столбца DataColumn таблицы DataTable. Для этого в датасете должны быть определены отношения между таблицами. Например, Parent.Price даст значение столбца Price у родительской таблицы, а Sum(Child.Price) - сумму цен из дочерней таблицы. Если отношений несколько, используется название отношения: Avg(Child(Customers2Orders).Quantity)

Либо сформировать результат в базе данных
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32625101
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в DataGrid:

<asp:TemplateColumn HeaderText="Rights">
<HeaderStyle CssClass="corpblue"></HeaderStyle>
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Rights") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>

Что мне писать вместо DataItem.Rights, чтобы обратиться к родительской таблице Office и полю в ней OfficeName?
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32625285
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так нельзя. DataGrid использует свойство таблицы DefaultView, а там ссылки на другие таблицы недопустимы.

Можно написать обработчик OnItemDataBound и присваивать значение метке самостоятельно.

Еще один вариант - работать не с таблицами, а с бизнес-объектами.
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32625487
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. допустим, есть у меня в одном датасете Order и Customer. Правильно я понимаю, что надо будет завести еще одну таблицу в том же датасете - OrderCustomer для показа одновременно данных по заказу и по покупателю этого заказа в одной строке? И как оптимальнее такую таблицу заполнять, если обходиться без использования SQL вообще - работа ведется только с отсоединенными данными.
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32625784
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создание еще одной таблицы приведет к дублированию данных. Я бы добавил вычисляемый столбец:

Код: plaintext
ds.Order.Columns.Add(new DataColumn("CustomerName", typeof(string),"Parent(CustomerOrder).Name"));
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32625925
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, но Dataset у меня генереный визардом(и его XSD может меняться). Как можно в таком случае поступить?
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32625987
Ustazz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно создать свой датасет, наследующий сгенерированному и в его конструкторе добалвять столбцы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
using System;
using System.Data;

namespace WebTest1
{
	public class MyDataSet : DataSet1
	{
		public MyDataSet(): base()
		{
			this.Order.Columns.Add(
			new DataColumn("CustomerName", typeof(string),
			"Parent(CustomerOrder).Name"));
		}
	}
}
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32626198
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, но Dataset у меня генереный визардом(и его XSD может меняться). Как можно в таком случае поступить?

Expression column можно добавить и в XSD

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32626338
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил я колонку в DataTable. ВОт какой XSD получается:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="DataSetOffices" targetNamespace="http://tempuri.org/DataSetOffices.xsd" elementFormDefault="qualified"
attributeFormDefault="qualified" xmlns="http://tempuri.org/DataSetOffices.xsd" xmlns:mstns="http://tempuri.org/DataSetOffices.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="DataSetOffices" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Office" msdata:Locale="ru-RU">
<xs:complexType>
<xs:sequence>
<xs:element name="ObjectID" type="xs:int" minOccurs="0" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="1" />
<xs:element name="OfficeName" type="xs:string" minOccurs="0" />
<xs:element name="OfficeCode" type="xs:string" minOccurs="0" />
<xs:element name="OfficeLogin" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="OfficePassword" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="AgentNetwork" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="Phone" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="EMail" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="ExtraInfo" type="xs:string" minOccurs="0" nillable="true" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="User" msdata:Locale="ru-RU">
<xs:complexType>
<xs:sequence>
<xs:element name="ObjectID" type="xs:ID" minOccurs="0" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="1" />
<xs:element name="Login" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="Password" type="xs:string" minOccurs="0" />
<xs:element name="Rights" type="xs:int" minOccurs="0" />
<xs:element name="LostPacketListStyle" type="xs:int" minOccurs="0" nillable="true" />
<xs:element name="ReportsStyle" type="xs:int" minOccurs="0" nillable="true" />
<xs:element name="EMail" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="Phone" type="xs:string" minOccurs="0" />
<xs:element name="Web" type="xs:string" minOccurs="0" />
<xs:element name="ExtraInfo" type="xs:string" minOccurs="0" nillable="true" />
<xs:element name="OfficeID" type="xs:int" minOccurs="0" />

<xs:element name="UserOfficeName" type="xs:string" minOccurs="0" msdata:Expression="Parent.OfficeName" />


</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="DataSetOfficesKey1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Office" />
<xs:field xpath="mstns:ObjectID" />
</xs:key>
<xs:key name="DataSetOfficesKey2" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:User" />
<xs:field xpath="mstns:ObjectID" />
</xs:key>
<xs:keyref name="OfficeUser" refer="DataSetOfficesKey1" msdata:ConstraintName="OfficeUser">
<xs:selector xpath=".//mstns:User" />
<xs:field xpath="mstns:OfficeID" />
</xs:keyref>
<xs:key name="DataSetOfficesKey3">
<xs:selector xpath=".//mstns:Office" />
<xs:field xpath="mstns:OfficeCode" />
</xs:key>
</xs:element>
</xs:schema>

Связал ее с гридом:

<asp:TemplateColumn HeaderText="UserOfficeName">
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.UserOfficeName") %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>

Обе таблицы непустые на момент вызова DataGrid1.DataBind(). Но показаться успевают, только те, кто идет в гриде до этой самой "UserOfficeName". На ней ловится такой eхception:

"DataBinder.Eval: 'System.Data.DataRowView' does not contain a property with the name UserOfficeName."

Как это лечить?
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32626365
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В winforms все должно работать.

Как советовал Ustazz не пробовали?
...
Рейтинг: 0 / 0
Как в DataGrid показать данные, собранные из разных DataTable?
    #32628084
Blackmore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все нормально проходит, спасибо за совет. Грабли тут в другом - dataset получается по remoting-у, а он почему-то срезает при передаче вычисляемые колонки из датасета ((((((((
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как в DataGrid показать данные, собранные из разных DataTable?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]