![](/img/trans.png)
[英]How to delete column from GridView where DataSource is a DataTable and AutoGenerateColumns is true?
[英]How to change datagridview column date format when gridview has autogeneratecolumns=true
我根據搜索參數在gridview中自動生成列,將添加或刪除少量列。
請建議我為gridview中的整個列設置日期格式為dd-mmm-yyyy
。
現在,我正在使用rowdatabound
。 它檢查每一行,因此顯示結果需要時間。
這就是我在rowdatabound
中rowdatabound
if (e.Row.RowType == DataControlRowType.DataRow)
{
System.Data.DataRowView dtview;
DateTime dt;
int intCounter;
dtview = (DataRowView)e.Row.DataItem;
for (intCounter = 0; intCounter <= dtview.Row.ItemArray.Length - 1; intCounter++)
{
if (dtview.Row.ItemArray[intCounter] is System.DateTime)
{
dt = (DateTime)dtview.Row.ItemArray[intCounter];
e.Row.Cells[intCounter].Text = dt.ToString("dd-MMM-yyyy");
}
}
}
這將檢查所有記錄,然后根據條件進行更改。
但我想做得更好,只需識別列並更改完整列的日期格式。
免責聲明:我自己沒試過,但看起來很可能。
GridView
有一個名為ColumnsGenerator
的公共屬性,其屬性類型為IAutoFieldGenerator
。 這是確定如何生成列的對象。
已經有IAutoFieldGenerator
的實現,默認的一個: GridViewColumnsGenerator
。 這是一個公開的非密封類,您可以從中派生出類型。
您必須覆蓋的方法是這樣的:
public override List<AutoGeneratedField> CreateAutoGeneratedFields(
object dataObject, Control control);
注意輸出, AutoGeneratedField
的List <T>。 AutoGeneratedField
有一個名為DataFormatString
的屬性:
public override string DataFormatString { get; set; }
所以你要做的就是覆蓋CreateAutoGeneratedFields
,如下所示:
public class MyDerivedGridViewColumnsGenerator : GridViewColumnsGenerator
{
public override List<AutoGeneratedField> CreateAutoGeneratedFields(
object dataObject, Control control)
{
var list = base.CreatedAutoGeneratedFields(dataObject, control);
foreach(var field in list)
{
if(field.DataType == typeof(DateTime))
field.DataFormatString = "dd-MMM-yyyy";
}
return list;
}
}
現在,我不清楚如何設置ColumnsGenerator
屬性,因此您可能必須在代碼中執行此操作。 但這應該相當簡單,因為GridViewColumnsGenerator
有一個無參數構造函數:
// GridView myGridView;
myGridView.ColumnsGenerator = new MyDerivedGridViewColumnsGenerator();
我會在綁定到GridView
之前設置它,所以它在創建列時就到位了。
我有點晚了。 但這對我有用。 它仍然使用RowDataBound()方法。 但它只針對數據源中的第一行運行。
protected void gvGridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
DataRowView drv = (DataRowView)e.Row.DataItem;
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 0; i < ct_columns; i++)
{
DataControlFieldCell dcf = e.Row.Cells[i] as DataControlFieldCell;
/* default date format: hide 'time' values */
if (e.Row.RowIndex == 0
&& (dcf.ContainingField.GetType().Name == "BoundField" // defined columns
|| dcf.ContainingField.GetType().Name == "AutoGeneratedField")) // auto-generated columns
{
BoundField bf = dcf.ContainingField as BoundField;
if (bf != null && String.IsNullOrEmpty(bf.DataFormatString))
{
string col_name = bf.DataField;
if (!String.IsNullOrEmpty(col_name) && drv[col_name] != null)
{
if (drv[col_name].GetType().Name == "DateTime")
{
// set format for first row
string date = drv[col_name].ToString();
if (!String.IsNullOrEmpty(date))
dcf.Text = DateTime.Parse(date).ToShortDateString();
// set format for other rows
bf.DataFormatString = "{0:M/dd/yyyy}";
}
}
}
}
}
}
}
如果要將DataTable綁定到Grid,則編寫擴展方法或鏈接Query
public static void ChangeDateFormat<T>(this DataColumn column, Func<object, T> conversion)
{
foreach(DataRow row in column.Table.Rows)
{
row[column] = conversion(row[column]);
}
}
並稱之為方法
dataTable.Columns["DateColumanName"].ChangeDateFormat(
val => DateTime.Parse(val.ToString()).ToString("dd/MMM/yyyy"));
從這里拉出實際源代碼
並且還要注意,您需要檢查列和數據類型的存在以及其他檢查以消除錯誤。
希望能幫助到你。
這是一個相當簡單的解決方案:不是單獨處理每一行,而是在綁定網格之前設置列。
在以下示例中, view
是一個生成常規DataTable
的對象,網格視圖的AutoGenerateColumns
屬性設置為false
。
實質上,您只需檢查列的數據類型,並在其DateTime
,設置所需的格式。
DataTable dt = view.GetReport();
Type dateType = typeof(DateTime);
foreach (DataColumn column in dt.Columns)
{
BoundField f = new BoundField();
f.HeaderText = column.ColumnName;
f.DataField = column.ColumnName;
if(column.DataType == dateType)
f.DataFormatString = "{0:d}"; // Or whatever
gvReport.Columns.Add(f);
}
gvReport.DataSource = dt;
gvReport.DataBind();
我設法格式化自動生成的datetime列的值,實現DataGridView的事件ColumnAdded:
private void dataGridView_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
if (e.Column.ValueType == typeof(DateTime))
{
e.Column.DefaultCellStyle.Format = "dd-MMM-yyyy";
}
}
使用Eval
函數在aspx代碼中定義字符串形成:
<% # Eval("Date", "{0:dd-MMM-yyyy}") %>
完整示例:
<asp:TemplateField HeaderText="Date">
<ItemTemplate>
<% # Eval("Date", "{0:dd-MMM-yyyy}") %>
</ItemTemplate>
</asp:TemplateField>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.