Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: формат времени до сотых долей секунд в DGV Добавлено: 05.03.09 18:50  

Автор вопроса:  aleha
Господа. может кто подскажет, а то я что-то запутался и в МСДН не могу нужного найти.
У меня в DatagridView падают значения из базы SQL по запросу, где одно поле имеет формат Time. И если встречаются доли секунд то он мне выводит число с кучей последующих нулей, как мне настроить формат столбца DGV, чтобы он выводил только первые 2 числа доли секунды:
т.е. в базе находится число 00:00:00.1000000 (в таком же виде оно выводится в датагридвиев), а мне надо чтобы в ДГВ отобразилось 00:00:00.1

попробовал поменять в самой базе длину символов после запятой до 2, а в ДГВ выводит всё равно все 7 цифр.

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #1 Добавлено: 06.03.09 02:57
  1. Math.Round(...)

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 06.03.09 04:49
Math.Round(...)

и как же ты там собрался DateTime округлять, когда Math.Round только Decimal и Double принимает?

Ответить

Номер ответа: 3
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #3 Добавлено: 06.03.09 05:35
и как же ты там собрался DateTime округлять, когда Math.Round только Decimal и Double принимает?
Наверно гоню.
Недочитал.

Ответить

Номер ответа: 4
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #4 Добавлено: 06.03.09 06:38
Тебе просто для этой колонки надо задать соответствующую строку форматирования и выводить данные в нужном формате. К примеру вот такой код:

            ;DateTime t = DateTime.Now;
            Console.WriteLine(t.ToString("HH:mm:ss.ff";));

выведет время с 2 знаками поле запятой.
Ты же наверняка выводишь данные через скриплет Eval, вот его приведи к типу DateTime(это обязательно надо сделать потому что он возвращает object) и дальше уже ToString с нужным тебе форматом.

Ответить

Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 06.03.09 06:40
(*ворчливо) блин.. ваши добаные смайлики.. ведь был же нормальный форум.. так нет же.. детство в одном месте заиграло.. смайликов нафтыкали
  1.  
  2.             DateTime t = DateTime.Now;
  3.             Console.WriteLine(t.ToString("HH:mm:ss.ff"));

Ответить

Номер ответа: 6
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #6 Добавлено: 06.03.09 12:03
в самом SQL тип данных для данного столбца выбран - "Time", при заполнении DataTable SqlDataAdapterom тип столбца становится TimeSpan и соответственно при привязке DataGridView через DataSource этот столбец остаётся с типом TimeSpan. Весь вечер убил на попытку как-нибудь привести это к какому-нибудь форматированному виду или преобразовать во что-нибудь отличное от timespan и что-то не получилось. Странно что никак нельзя удалить эти последующие нули, да и вообще зачем он их выводит....
Может быть кто-нить попробовал бы эту цепочку с выводом данных из SQL в DataGridView и отписал бы пример с кодом?

Ответить

Номер ответа: 7
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 06.03.09 13:39
Может быть кто-нить попробовал бы эту цепочку с выводом данных из SQL в DataGridView и отписал бы пример с кодом?

да тут и пробовать нечего.. задача тривиальная.
1. Открываешь форму и выделяешь свой DataGridView
2. В Свойствах находишь Columns и тыкаешь туда (либо просто жмешь Edit Columns) - открывается диалог Edit Columns3. Слева выделяешь твой столбец в котором отображается время, а справа ищешь DefaultCellStyle и жмешь туда.. открывается диалог CellStyleBuilder
4. В этом диалоге находишь Format и вводишь туда HH:mm:ss.ff, если надо просто время то можешь набрать просто T либо там же ткнешь на кнопку и выберишь формат из списка
5. Наслаждаешься полученным результатом (это очень важно)

Ответить

Номер ответа: 8
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #8 Добавлено: 06.03.09 14:28
у меня DGV пустой изначально, колонки формируются после выгрузки данных из БД (там куча условий, так что колонки и данные могут быть каждый раз разные)
Пробовал уже после формирования данных делать через комманду: DataGridView.Columns(номер_колонки).DefaultCellStyle.Format = "T" или DataGridView.Columns(номер_колонки).DefaultCellStyle.Format = "HH:mm:ss.ff"
но ничего не изменятся, как выводилось "00:00:00.1000000" так и выводится.... вот и думаю что надо копать куда-глубже или где в другом месте смотреть

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 06.03.09 16:45
мда.. наступил ты брат на грабли... судя по документации TimeSpan не поддерживает toString("X";), а это говорит о том, что мой да и твой способ работать не будут... Проще всего, если есть возможность то лучше всего изменить в БД тип этого поля.. если же нет, то придется извращаться

Ответить

Номер ответа: 10
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #10 Добавлено: 06.03.09 17:51
да к сожалению toString(format) не поддерживается timespan-ом, об этом я в курсе. А как извращаться? есть идеи?

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 06.03.09 18:10
А как извращаться? есть идеи?

ну первое что приходит в голову это
1.после привязки к данным изменить тип данных колонки
  1. dataGridView1.Columns["TimeToDeath"].ValueType = typeof(string);

2.Подписаться на форматирование ячейки и привести строку к нужному виду
  1. С#
  2.         void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  3.         {
  4.             if (e.Value != null && e.ColumnIndex == dataGridView1.Columns["TimeToDeath"].Index)
  5.             {
  6.                 string format="{0}.{1}:{2}:{3}.{4}";
  7.                 TimeSpan span = TimeSpan.Parse(e.Value.ToString());
  8.                 e.Value = string.Format(format, span.Days,
  9.                                                 span.Hours.ToString("00"),
  10.                                                 span.Minutes.ToString("00"),
  11.                                                 span.Seconds.ToString("00"),
  12.                                                 span.Milliseconds.ToString("000"));
  13.             }
  14.         }



криво,конечно, но что то пока идей больше нету..

Ответить

Номер ответа: 12
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 06.03.09 18:13
либо через DataBindings что то мутить.. но это, по сути, такие же костыли.

Ответить

Номер ответа: 13
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #13 Добавлено: 06.03.09 22:17
спасибо за пример, я его в VB перевёл.
не очень то и криво, если в одну строчку, то вполне прямо))) вообще выгрузилось то что надо, убрал дни и часы и получил искомое, правда он мне 3 символа после запятой выводит независимо от того сколько я проставляю в параметре span.Milliseconds.ToString, видимо это уже какое-то ограничение может быть срабатывает.

а как можно не криво сделать?

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 06.03.09 23:09
а как можно не криво сделать?

попробуй еще такой варинт..
  1.  
  2.                 TimeSpan span = TimeSpan.Parse(e.Value.ToString());
  3.                 DateTime dt = DateTime.MinValue.Add(span);
  4.                 e.Value = dt.ToString("mm:ss.ff");

Ответить

Номер ответа: 15
Автор ответа:
 aleha



Вопросов: 8
Ответов: 19
 Профиль | | #15 Добавлено: 07.03.09 12:29
в другом месте ещё подсмотрел вариант, получилось ещё короче, но в принципе смысл тот же:
  1.  
  2. Dim span As TimeSpan = TimeSpan.Parse(e.Value.ToString())
  3. e.Value = DateTime.Parse(span.ToString).ToString("mm:ss.ff")



за что они так ограничили timespan не понятно))

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам