【问题标题】:Asp.net c# multiple value in a single column of gridviewAsp.net c#gridview单列中的多个值
【发布时间】:2012-06-23 00:44:41
【问题描述】:

如何在GridView 的单列中显示多个值?例如,当我在TextBox 中搜索“Ivan”时,输出将返回多行 Ivan,如下所示:

命名任务
伊万任务1
伊万任务2
伊万任务3

我想要这样的东西

命名任务
伊万任务1,任务2,任务3

我的桌子是这样的

员工(身份证、姓名)
任务(ID、名称)
EmployeeTask(employee.id,task.id)

这是我的sql代码

SELECT  e.name,  t.name
FROM EmployeeTask et
INNER JOIN employee e ON e.id = et.employee_id
INNER JOIN task t ON t.id = et.task_id
WHERE e.name = @Name

这是我的GridView 标记

<Columns>
    <asp:BoundField DataField="name" HeaderText="Name" SortExpression="name"/>
    <asp:BoundField DataField="task" HeaderText="Task" SortExpression="task"/>        
</Columns>

【问题讨论】:

  • 您如何将信息添加到您的表格中?
  • 检查这个。这可能会帮助你stackoverflow.com/a/11126887/610194
  • 请您复制一些您的 GridView 代码,以便我了解您当前如何绑定列
  • 您如何访问您的数据(实体框架、linq-to-sql 等)?有多种方法可以做到这一点,因此了解一下会有所帮助。
  • 从数据库中获取数据时,您可以连接。

标签: c# asp.net gridview webforms


【解决方案1】:

在纯 SQL 中,这是一种获得所需结果的方法,然后您可以将其输入到 GridView:

SELECT     e.name, REPLACE(REPLACE(REPLACE
                          ((SELECT     t.name
                              FROM         EmployeeTask AS et INNER JOIN
                                                    task AS t ON t.id = et.task_id
                              WHERE     (et.employee_id = e.id)
                              FOR XML RAW(''), ELEMENTS)
                   , '</name><name>', ', '), '<name>', ''), '</name>', '') AS EmployeeTasks
FROM         employee AS e
WHERE     (e.name = @Name)

本质上,它是一个子查询,将任务扁平化为 XML 输出,然后用逗号替换标签。

【讨论】:

  • 如果我想在每个任务之后添加一个新的换行符,我应该在哪里使用?我试过 CHAR(10);但它给了我一个语法错误
  • 修改该行如下, '&lt;/name&gt;&lt;name&gt;', CHAR(13) + CHAR(10)), '&lt;name&gt;', ''), '&lt;/name&gt;', '') AS EmployeeTasks
【解决方案2】:

您必须更改您的 SQL 查询。

  • 如果您使用的是 MySQL,您可以使用 group_concat。
  • 如果您使用的是 MSSQL,您可以找到答案here

【讨论】:

    【解决方案3】:

    您需要使用类似这样的 SQL 连接任务名称,请注意我还没有测试过脚本

        DECLARE @CTasks VARCHAR(500)
        SET @CTasks = ''
    
        SELECT @CTasks = @CTasks  + t.Task + ', ' FROM Employee e
        INNER JOIN Tasks t ON t.EmployeeId = e.Id
        WHERE e.Name = @Name
        ORDER BY e.Name ASC
    
        IF LEN(@CTasks) > 0
        SELECT @Name As Name, @CTasks As Tasks
    
    You might end up getting a ',' at the end that needs taking care from Tasks column
    
    Hope this helps...
    

    【讨论】:

      【解决方案4】:

      如果您使用的是 mssql server 2008 那么 有一个对枢轴函数的介绍,它做同样的事情 你在问题中提到了

      How to Use Pivot

      希望对您有所帮助

      【讨论】:

        【解决方案5】:

        在甲骨文中:

        select name,wm_concat(task) as task from table name group by name
        

        我不知道在 sql Server 中。但我认为它可能对你有帮助。

        Similar Type Question, See it

        在 Sql 中:

        SELECT Field1, Substring(Field2, 2, LEN(Field2)) AS Field2 FROM
        (
            SELECT
                [InnerData].Field1,
                (SELECT  ',' + Field2 FROM @Fields WHERE Field1=[InnerData].Field1 FOR XML PATH('')) AS Field2
                FROM
                (
                    SELECT DISTINCT Field1 FROM @Fields
                ) AS [InnerData]
        ) AS OuterData
        

        我从下面的链接得到这个查询

        Refer this link

        【讨论】:

          【解决方案6】:

          创建一个新类:

          Class EmployeeWithTask{ string employeeName{get;set} list<string>employeeTasks {get,set}}
          

          创建一个 EmployeeWithTask 列表。在您检索任务列表后,为结果中的每个不同员工循环遍历结果并创建一个 EmployeewithTask 实例。 最后将 EmployeeWithTask 列表绑定到你的 gridview

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-11
            • 2013-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            相关资源
            最近更新 更多