Я хотел бы изменить способ, которым объект DateTime отображен в DataGridView. А именно, я хотел бы отобразить секунды со временем.
c# .net 2.0
dataGridView1.Columns[0].DefaultCellStyle.Format = "MM/dd/yyyy HH:mm:ss";
Чтобы узнать о конкретном форматировании, просмотрите следующие ссылки:
Вы можете попробовать отредактировать формат RowDefaultCellStyle-> в дизайне и выбрать приемлемый формат, или использовать следующий:
DataGridViewCellStyle customStyle = new DataGridViewCellStyle();
customStyle.Format = "T";
customStyle.NullValue = null;
customGridView.RowsDefaultCellStyle = customStyle;
Переопределите событие OnRowDataBound и прочитайте немного больше о культурах и форматировании в . Net
protected override void OnRowDataBound(GridViewRowEventArgs e)
{
base.OnRowDataBound(e);
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 0; i < e.Row.Cells.Count; i++)
{
TableCell cell = e.Row.Cells[i];
cell.Text = DateTime.Parse ( cell.Text, culture );
}
}
}
Если ваши привязки являются пустыми, я не совсем уверен, что ваша проблема охвачена другими объяснениями. В нашей базе кода мы делаем следующее, и привязки всегда есть:
public static ASTNode getASTNodeFromCompilationUnit(ICompilationUnit compUnit) {
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setResolveBindings(true);
parser.setSource(compUnit);
return parser.createAST(/* passing in monitor messes up previous monitor state */ null);
}
Поэтому единственные различия, которые я могу видеть, это порядок вызовов для разрешения привязок, и тот факт, что мы не вызываем setKind на синтаксическом анализаторе. Есть шанс попробовать его именно с этим кодом и посмотреть, что произойдет?
-121--3926611-Кроме рекомендации Нила о комбинированном векторе + карте, если вам нужно сохранить порядок вставки и возможность поиска по ключу, вы также можете рассмотреть возможность использования библиотеки увеличенного мультииндекса, которые предоставляют контейнеры, адресуемые более чем одним способом.
-121--1547479-Один из способов - обработка события CellFormattingEvent , а затем отображение требуемых данных.
Вот примеры 3 различных способов:
Какое-либо применение?
using System;
using System.ComponentModel;
using System.Windows.Forms;
public class MyData
{
public DateTime A { get; set; }
public DateTime B { get; set; }
public DateTime C { get; set; }
[TypeConverter(typeof(CustomDateTimeConverter))]
public DateTime D { get; set; }
}
class CustomDateTimeConverter : DateTimeConverter
{
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
return ((DateTime)value).ToString("dd-MM-yyyy HH:mm:ss");
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
static class Program {
[STAThread]
static void Main()
{
DateTime when = DateTime.Now;
var data = new BindingList<MyData>
{
new MyData { A = when, B = when, C = when }
};
using (var form = new Form())
using (var grid = new DataGridView {
AutoGenerateColumns = false,
DataSource = data, Dock = DockStyle.Fill })
{
form.Controls.Add(grid);
grid.Columns.Add(
new DataGridViewTextBoxColumn {
HeaderText = "Vanilla",
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
DataPropertyName = "A",
});
grid.Columns.Add(
new DataGridViewTextBoxColumn {
HeaderText = "Format",
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
DataPropertyName = "B",
DefaultCellStyle = { Format = "dd/MM/yyyy HH:mm:ss" }
});
grid.Columns.Add(
new DataGridViewTextBoxColumn {
HeaderText = "CellFormatting",
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
DataPropertyName = "C",
});
grid.CellFormatting += (sender, args) =>
{
if (args.Value != null && args.ColumnIndex == 2
&& args.DesiredType == typeof(string))
{
args.Value = ((DateTime)args.Value).ToString("dd MM yyyy HH:mm:ss");
}
};
grid.Columns.Add(
new DataGridViewTextBoxColumn {
HeaderText = "TypeConverter",
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
DataPropertyName = "D",
});
Application.Run(form);
}
}
}