作成日: 2015/03/12 最終更新日: 2017/01/17
文書種別
不具合
状況
修正済み
詳細
DateTime型のデータが設定された列で書式を設定してフィルタリングを実行すると、正常にフィルタリングされない場合があります。下記の表は、ExcelとC1GridViewのフィルタリングの実行結果です。
◎テストデータと列の書式

◎フィルタリングの実行結果
書式「yyyy/M/d h:mm:ss」の列

書式「yyyy/M/d」の列

書式「yyyy/M」の列

書式「yyyy」の列

【再現手順】
1. サンプルコードを実行します。
2. C1GridViewのフィルタボックスに上記の表のデータを入力します。
3. Excelのフィルタボックスで上記の表のデータを入力します。
4. C1GridViewとExcelでフィルタリングの実行結果を比較します。
【サンプルコード】
public partial class Default : System.Web.UI.Page
{
private string[] ColumnNames = { "ID", "yyyy/M/d h:mm:ss", "yyyy/M/d", "yyyy/M", "yyyy" };
private string[] Dates = { "2015/1/1 1:00:00", "2015/1/1 2:00:00", "2015/1/2 1:00:00", "2015/2/1 1:00:00", "2016/1/1 1:00:00" };
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
C1GridView1.ShowFilter = true;
C1GridView1.AutogenerateColumns = false;
foreach (var columnName in ColumnNames)
AddC1GridViewColumn(columnName, C1GridView1);
C1GridView1.DataSource = CreateDataTable();
C1GridView1.DataBind();
}
C1GridView1.Filtering += C1GridView1_Filtering;
C1GridView1.Filtered += C1GridView1_Filtered;
}
protected void C1GridView1_Filtering(object sender, C1GridViewFilterEventArgs e)
{
}
protected void C1GridView1_Filtered(object sender, EventArgs e)
{
C1GridView1.DataSource = CreateDataTable();
C1GridView1.DataBind();
}
private DataTable CreateDataTable()
{
var dt = new DataTable();
foreach (var columnName in ColumnNames)
AddDatatableColumn(columnName, dt);
int id = 1;
foreach (var dateString in Dates)
{
var date = DateTime.Parse(dateString);
dt.Rows.Add(id, date, date, date, date);
id++;
}
return dt;
}
private void AddC1GridViewColumn(string columnName, C1GridView grid)
{
var column = new C1BoundField() { DataField = columnName, HeaderText = columnName };
if (columnName != "ID")
column.DataFormatString = columnName;
grid.Columns.Add(column);
}
private void AddDatatableColumn(string columnName, DataTable dt)
{
Type type = typeof(DateTime);
if (columnName == "ID")
type = typeof(int);
dt.Columns.Add(columnName, type);
}
}
◎テストデータと列の書式

◎フィルタリングの実行結果
書式「yyyy/M/d h:mm:ss」の列

書式「yyyy/M/d」の列

書式「yyyy/M」の列

書式「yyyy」の列

【再現手順】
1. サンプルコードを実行します。
2. C1GridViewのフィルタボックスに上記の表のデータを入力します。
3. Excelのフィルタボックスで上記の表のデータを入力します。
4. C1GridViewとExcelでフィルタリングの実行結果を比較します。
【サンプルコード】
public partial class Default : System.Web.UI.Page
{
private string[] ColumnNames = { "ID", "yyyy/M/d h:mm:ss", "yyyy/M/d", "yyyy/M", "yyyy" };
private string[] Dates = { "2015/1/1 1:00:00", "2015/1/1 2:00:00", "2015/1/2 1:00:00", "2015/2/1 1:00:00", "2016/1/1 1:00:00" };
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
C1GridView1.ShowFilter = true;
C1GridView1.AutogenerateColumns = false;
foreach (var columnName in ColumnNames)
AddC1GridViewColumn(columnName, C1GridView1);
C1GridView1.DataSource = CreateDataTable();
C1GridView1.DataBind();
}
C1GridView1.Filtering += C1GridView1_Filtering;
C1GridView1.Filtered += C1GridView1_Filtered;
}
protected void C1GridView1_Filtering(object sender, C1GridViewFilterEventArgs e)
{
}
protected void C1GridView1_Filtered(object sender, EventArgs e)
{
C1GridView1.DataSource = CreateDataTable();
C1GridView1.DataBind();
}
private DataTable CreateDataTable()
{
var dt = new DataTable();
foreach (var columnName in ColumnNames)
AddDatatableColumn(columnName, dt);
int id = 1;
foreach (var dateString in Dates)
{
var date = DateTime.Parse(dateString);
dt.Rows.Add(id, date, date, date, date);
id++;
}
return dt;
}
private void AddC1GridViewColumn(string columnName, C1GridView grid)
{
var column = new C1BoundField() { DataField = columnName, HeaderText = columnName };
if (columnName != "ID")
column.DataFormatString = columnName;
grid.Columns.Add(column);
}
private void AddDatatableColumn(string columnName, DataTable dt)
{
Type type = typeof(DateTime);
if (columnName == "ID")
type = typeof(int);
dt.Columns.Add(columnName, type);
}
}
旧文書番号
81214