将列 Headers 显示为日期 Telerik Rad 网格
Displaying Column Headers As Dates Telerik Rad Grid
通常我会有 post 的代码。但是,我不确定从哪里开始。也许我不正确,但这个请求与大多数(来自客户)的请求略有不同。因此,他们需要在其页面中添加一项新功能。他们希望能够 运行 一份显示所有员工在给定周内的总工时的报告。他们将使用 DatePicker select 开始日期和另一个 select 和结束日期。然后,单击一个按钮以 运行 报告。该报告将员工姓名作为第一列,之后的每一列都有一个 header,这是一个日期。因此,如果他们 selected 8-5-2017 和 8-19-2017 列 headers 将是 8-5-2017| 2017 年 8 月 12 日| 2017 年 8 月 19 日。这些列下方是每个员工在该周的总工作时数。
我附上了我需要做的事情的图片。希望这会提供额外的说明。
我遇到过类似的情况,并通过使用包含我的数据的 DataTable
设法解决了它。填充 DataTable
的一种简单方法是创建存储过程。
在我的示例中,我将简单地在 2 个给定日期之间的每一天执行此操作,您应该能够更改此代码以使其每 7 天工作一次,从 monday/sunday 开始,具体取决于你的要求是什么。如果你也需要这方面的帮助,请发表评论,如果我有时间,我会看看我能做些什么。
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
这应该 return 一个 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
项目源绑定到 DataTable
的 DefaultView
属性 并拥有 AutoGenerateColumns="True"
,您就可以编辑该列通过编写 AutoGeneratingColumn
的自定义实现来更多地命名和其他内容
<telerik:RadGridView x:Name="MyGridView"
AutoGenerateColumns="True"
ItemsSource="{Binding MyDataTable.DefaultView}"
AutoGeneratingColumn="MyGridView_OnAutoGeneratingColumn">
</telerik:RadGridView>
我希望这可以帮助您解决问题。如果您还有其他问题,请随时发表评论。
通常我会有 post 的代码。但是,我不确定从哪里开始。也许我不正确,但这个请求与大多数(来自客户)的请求略有不同。因此,他们需要在其页面中添加一项新功能。他们希望能够 运行 一份显示所有员工在给定周内的总工时的报告。他们将使用 DatePicker select 开始日期和另一个 select 和结束日期。然后,单击一个按钮以 运行 报告。该报告将员工姓名作为第一列,之后的每一列都有一个 header,这是一个日期。因此,如果他们 selected 8-5-2017 和 8-19-2017 列 headers 将是 8-5-2017| 2017 年 8 月 12 日| 2017 年 8 月 19 日。这些列下方是每个员工在该周的总工作时数。
我附上了我需要做的事情的图片。希望这会提供额外的说明。
我遇到过类似的情况,并通过使用包含我的数据的 DataTable
设法解决了它。填充 DataTable
的一种简单方法是创建存储过程。
在我的示例中,我将简单地在 2 个给定日期之间的每一天执行此操作,您应该能够更改此代码以使其每 7 天工作一次,从 monday/sunday 开始,具体取决于你的要求是什么。如果你也需要这方面的帮助,请发表评论,如果我有时间,我会看看我能做些什么。
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
这应该 return 一个 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
项目源绑定到 DataTable
的 DefaultView
属性 并拥有 AutoGenerateColumns="True"
,您就可以编辑该列通过编写 AutoGeneratingColumn
<telerik:RadGridView x:Name="MyGridView"
AutoGenerateColumns="True"
ItemsSource="{Binding MyDataTable.DefaultView}"
AutoGeneratingColumn="MyGridView_OnAutoGeneratingColumn">
</telerik:RadGridView>
我希望这可以帮助您解决问题。如果您还有其他问题,请随时发表评论。