显示列标题作为日期Telerik Rad Grid

时间:2017-09-12 01:32:01

标签: c# sql asp.net vb.net telerik

通常我会发布代码。但是,我不知道从哪里开始。也许我不对,但这个请求与大多数(来自客户)有点不同。因此,他们需要在页面中添加新功能。他们希望能够运行一份报告,显示所有员工在给定的一周内的总小时数。他们将使用DatePicker选择开始日期,使用另一个选择和结束日期。然后,单击按钮以运行报告。此报告将员工姓名作为第一列,然后每列后面将有一个日期标题。因此,如果他们选择了8-5-2017和8-19-2017,则列标题将为8-5-2017 | 2017年8月12日| 2017年8月19日。在这些列的下方将是每个员工在给定的一周工作的总小时数。

我附上了我需要做的事情的图像。希望这将提供额外的说明。sample display

1 个答案:

答案 0 :(得分:1)

我遇到了类似情况,并设法使用包含我的数据的DataTable解决了这个问题。填充DataTable的一种简单方法是创建存储过程。

在我的示例中,我将简单地在两个给定日期之间的每一天执行此操作,您应该能够更改此代码以使其每7天工作一次,从星期一/星期日开始,具体取决于您的要求是。如果您还需要帮助,请发表评论,如果我找到一些时间,我会看看我能做些什么。

CREATE TYPE [dbo].[DayTableType] AS TABLE(
    [Datum] [date] NOT NULL,
    [DayCol] [int] NOT NULL
)
GO


CREATE PROCEDURE [dbo].[MyStoredProcedure]
    -- Add the parameters for the stored procedure here
    @d1 datetime, @d2 datetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SET DATEFIRST 1;

    -- Insert statements for procedure here
DECLARE @StartDate date = CONVERT(date, @d1);
DECLARE @EndDate date = CONVERT(date, @d2);


DECLARE @Days dbo.DayTableType;
WITH cte AS (
    SELECT @StartDate AS Datum
    UNION ALL
    SELECT DATEADD(day,1,Datum) as Datum
    FROM cte
    WHERE DATEADD(day,1,Datum) <=  @EndDate
)
INSERT INTO @Days
SELECT cte.Datum, DATEPART(DAY, cte.Datum)
FROM cte
OPTION(MAXRECURSION 0);
DECLARE @dPivot NVARCHAR(MAX)
SELECT @dPivot = ''
SELECT @dPivot = @dPivot + '[' + CONVERT(VARCHAR(8),d.Datum,3) + '],' FROM @Days d
SELECT @dPivot = SUBSTRING(@dPivot,1,LEN(@dPivot)-1)

DECLARE @SQLSTR NVARCHAR(MAX);
SET @SQLSTR =
    'SELECT p.EmployeeId
        ,p.LastName
        ,p.FirstName
        ,'+ @dPivot + '
    FROM (SELECT CONVERT(VARCHAR(8),d.Datum,3) AS DayCol
            ,e.EmployeeId
            ,e.LastName
            ,e.FirstName
            ,ISNULL((SELECT SUM(w.WorkedHours) FROM dbo.[EmployeeWorkDateTable] w
                    WHERE w.EmployeeId = e.EmployeeId AND CONVERT(DATE, w.WorkDate) = CONVERT(DATE, d.Datum)),0) AS DayInfo
        FROM @Days d
        LEFT OUTER JOIN dbo.[EmployeeTable] e ON e.IsActive = 1
    ) t
    PIVOT (
        MAX(t.DayInfo) 
        FOR t.DayCol IN (' + @dPivot + ')
        ) AS p
    ORDER BY p.LastName'

EXECUTE SP_EXECUTESQL @SQLSTR, N'@Days DayTableType READONLY, @StartDate DATE, @EndDate DATE', @Days, @StartDate, @EndDate

END

这应该返回DataTable,看起来很像你在屏幕截图中发布的内容。 要将此显示正确地显示在GridView中,您需要首先在ViewModel中显示此内容,如下所示:

private DataTable _myDataTable;
public DataTable MyDataTable
{
    get { return _myDataTable; }
    set { SetProperty(ref _myDataTable, value); }
}



public void FillMyDataTable(DateTime startDate, DateTime endDate)
{
    using (var conn = new SqlConnection("MyConnectionString"))
    using (var cmd = new SqlCommand("MyStoredProcedure", conn) { CommandType = System.Data.CommandType.StoredProcedure })
    {
        cmd.Parameters.AddWithValue("@d1", startDate);
        cmd.Parameters.AddWithValue("@d2", endDate);

        var da = new SqlDataAdapter(cmd);
        var ds = new DataSet();
        da.Fill(ds);
        MyDataTable = ds.Tables[0];
    }       
}

现在您只需将GridView项源绑定到DefaultView的{​​{1}}属性并拥有DataTable,即可编辑列名和其他内容通过编写AutoGenerateColumns="True"

的自定义实现
AutoGeneratingColumn

我希望这可以帮助您解决问题。如果您还有其他问题,请随时发表评论。