Использование gridview для отображения строковых данных по вертикали в строке

#c# #sql #sql-server-2017 #aspxgridview #for-xml-path

#c# #sql #sql-server-2017 #aspxgridview #for-xml-path

Вопрос:

Я пытаюсь выяснить, есть ли способ взять строковые данные в столбцах Name, Address и DSL, которые были объединены в STUFF() и XML PATH, и отобразить их вертикально в той же строке, а не горизонтально на интерфейсе. Я использую gridview для отображения информации.

   SELECT  i.[InstrumentID], it.[InstrumentType],i.[InstrumentNumber], i.[NANumber],i.[DateTimeFiled],
    STUFF((SELECT ',   '   n.[Surname]   n.[GivenName]   '('   nc.[NameCode]   ')'  FROM [dbo].[tblName] n 
INNER JOIN [dbo].[tblNameCode] nc ON nc.[NameCodeID] = n.[NameCodeID] Where n.[InstrumentID] = i.[InstrumentID] ORDER BY  n.[Surname] FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, 1, '') AS Name ,
    STUFF(( SELECT ','   a.[StreetNumber]   a.[StreetName] FROM [dbo].[tblAddress] a Where a.[InstrumentID] = i.[InstrumentID] ORDER BY  a.[StreetName] FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, 1, '') AS Address,
    STUFF(( SELECT ''    d.[District]   ' '  d.[Square]  ' '   d.[Lot]   ', ' FROM [dbo].[tblDLS] d WHERE d.[InstrumentID] = i.[InstrumentID] FOR XML PATH (''), TYPE).value('.', 'varchar(max)'), 1, 1,'') AS DSL
FROM [dbo].[tblInstrument] i 
INNER JOIN [dbo].[tblInstrumentType] it ON i.[InstrumentTypeID] = it.[InstrumentTypeID] 
WHERE InstrumentNumber = 1
ORDER BY InstrumentNumber, InstrumentType 
  

Вот мой вывод

SampleTable

В получении результатов нет ничего плохого. Проблема заключается в вертикальном расположении данных. Вот скриншот моей программы также:

Страница выборки

Вот код aspx для отображения информации:

 <Columns>
 <asp:TemplateField HeaderText="Instrument #, Type, Dist., Squ. , Lot">
                       <ItemTemplate>
                            <asp:LinkButton ID="LbPath" runat="server" 
                               Text='<%# String.Format("{0} {1}", Eval("InstrumentNumber"), Eval("InstrumentType")) %>' 
                                CommandName="GetInstrument" 
                                CommandArgument='<%#Bind("instrumentID") %>'>
                            </asp:LinkButton>
                           <br />
                           <asp:Label ID="lblDateFiled" runat="server" Text='<%# Eval("DateTimeFiled") %>'> </asp:Label>
                             <br />
                            <asp:Label ID="lblNANumber" runat="server" Font-Names="Segoe UI Semibold" Font-Size="Medium" Text="NA Number: " ForeColor="#434343"></asp:Label><%# Eval("NANumber") %>
                           <br />
                           <br />
                           <asp:Label ID="lblDSL" runat="server" Text='<%#Eval("DSL") %>'> </asp:Label> 
                            <%--<asp:Label ID="lblDSL" runat="server" Text='<%# String.Format("{0} {1} {2}", Eval("District"), Eval("Square"),  Eval("Lot")) %>'> </asp:Label> --%>                           
                        </ItemTemplate>
                   </asp:TemplateField>
                        <asp:TemplateField HeaderText="Name, Address" SortExpression="Surname">
                <ItemTemplate>
                    <EditItemTemplate>
                        
                   <%-- <asp:Label ID="label1"  runat="server" Text='<%# Bind("instrumentID") %>' ></asp:Label>--%>
                </EditItemTemplate>
                                    <asp:Label ID="lblName" runat="server" Text='<%#  Eval("Name") %>'></asp:Label>
<%--                    <asp:Label ID="lblName" runat="server" Text='<%# String.Format(" {0}, {1} ({2})", Eval("Surname"), Eval("GivenName"), Eval("Namecode")) %>'></asp:Label>--%>
                    <br />
                    <asp:Label ID="lblAddress" runat="server" Font-Names="Segoe UI Semibold" Font-Size="Medium" Text='<%# Eval("Address") %>'></asp:Label>
                   <%--<asp:Label ID="lblAddress" runat="server" Font-Names="Segoe UI Semibold" Font-Size="Medium" Text='<%# String.Format("{0} {1} {2}", Eval("Subdivision"), Eval("StreetNumber"), Eval("StreetName")) %>'></asp:Label>--%>
                </ItemTemplate>
            </asp:TemplateField>
                  <%-- <asp:BoundField DataField="InstrumentType" HeaderText="Instrument Type" InsertVisible="false" ReadOnly="true" SortExpression="InstrumentType" />
                   <asp:BoundField DataField="NANumber" HeaderText="NANumber" InsertVisible="false" SortExpression="NANumber" />
                   <asp:BoundField DataField="DateTimeFiled" HeaderText="DateTimeFiled" InsertVisible="false" ReadOnly="true" SortExpression="DateTimeFiled" />--%>

               </Columns>
  

Комментарии:

1. Я не понимаю. Какое отношение к отображению данных имеет Sql Server?

2. Это больше похоже на запрос уровня представления. Даже тогда неясно, что вы имеете в виду по вертикали. Вы хотите, чтобы имя и адрес были вертикальными в одной ячейке? Если это так, и предполагается, что HTML, просто добавьте <br> при создании строки. Кроме того, поскольку вы находитесь в 2017 году, вы можете использовать string_agg() вместо метода stuff / xml.

3. @JohnCappelletti да, вы могли бы сказать уровень представления. Я отредактировал свой вопрос и добавил больше ясности, чтобы посмотреть, поможет ли это. Я пытаюсь просто заставить данные отображаться вертикально в одном столбце, а не встраиваться в одну строку с разделителем. Спасибо, что потратили время

Ответ №1:

Предполагая, что я понимаю ваши потребности, вы могли бы попробовать что-то вроде следующего:

 /* Create a mock-up table with sample data */

DECLARE @Data TABLE (
    InstrumentID INT, InstrumentType VARCHAR(50), InstrumentNumber INT, NANumber INT, DateTimeFiled DATETIME, [Name] VARCHAR(255) 
);

INSERT INTO @Data ( InstrumentID, InstrumentType, InstrumentNumber, NANumber, DateTimeFiled, [Name] )
VALUES
    ( 1625168, 'ACCOUNTS RECEIVABLE', 1, 785401, '1989-01-03 09:48:03.000', 'HIBERNIA NATIONAL BANK NEW ORLEANS' ),
    ( 1382385, 'SALE', 1, 785467, '1989-01-03 10:14:03.000', 'M amp; M RESTAURANT AND LOUNGE, INC' );

/* "Pivot" the columnar data */
SELECT
    x.f.value( 'fn:local-name(.)', 'VARCHAR(50)' ) AS [name],
    x.f.value( '.', 'VARCHAR(255)' ) AS [value]
FROM (
    
    /* Insert your T-SQL here... */
    SELECT CAST ( ( SELECT
        InstrumentID, InstrumentType, InstrumentNumber, NANumber, DateTimeFiled, [Name]
    FROM @Data
    FOR XML PATH( 'Data' ) ) AS XML ) AS DataXml

) AS d
CROSS APPLY d.DataXml.nodes( '//Data/*' ) x( f );
  

ВОЗВРАТ

  ------------------ ------------------------------------ 
|       name       |               value                |
 ------------------ ------------------------------------ 
| InstrumentID     | 1625168                            |
| InstrumentType   | ACCOUNTS RECEIVABLE                |
| InstrumentNumber | 1                                  |
| NANumber         | 785401                             |
| DateTimeFiled    | 1989-01-03T09:48:03                |
| Name             | HIBERNIA NATIONAL BANK NEW ORLEANS |
| InstrumentID     | 1382385                            |
| InstrumentType   | SALE                               |
| InstrumentNumber | 1                                  |
| NANumber         | 785467                             |
| DateTimeFiled    | 1989-01-03T10:14:03                |
| Name             | M amp; M RESTAURANT AND LOUNGE, INC   |
 ------------------ ------------------------------------ 
  

Комментарии:

1. Спасибо, что нашли время, чтобы помочь мне. Я отредактировал свой вопрос, чтобы уточнить, что я пытаюсь сделать. Основываясь на том, что я изначально спросил, вы дали мне правильный ответ. Сможете ли вы проверить мое редактирование и посмотреть, сможете ли вы помочь мне еще раз? Спасибо