【问题标题】:Displaying Column Headers As Dates Telerik Rad Grid将列标题显示为日期 Telerik Rad Grid
【发布时间】:2018-02-20 08:04:24
【问题描述】:

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

我附上了一张我需要做的图片。希望这将提供更多的说明。

【问题讨论】:

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


    【解决方案1】:

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

    在我的示例中,我将简单地在 2 个给定日期之间的每一天执行此操作,您应该能够更改此代码以使其每 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 itemsource 绑定到您的DataTableDefaultView 属性并拥有AutoGenerateColumns="True",您可以通过编写@987654331 的自定义实现来编辑列名和其他内容甚至更多@

    <telerik:RadGridView x:Name="MyGridView" 
        AutoGenerateColumns="True"
        ItemsSource="{Binding MyDataTable.DefaultView}"
        AutoGeneratingColumn="MyGridView_OnAutoGeneratingColumn">
    </telerik:RadGridView>
    

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

    【讨论】:

    • 这是一个非常可靠的解决方案。我不得不说,对于大多数问题,我收到的答案是最好的。很抱歉,我没有尽快回复以接受此解决方案。事情已经很疯狂了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多