вопрос:
вот таблица грида
|stag na etom predpriyatii | stag na drugom predpriyatii |summarny stag
num|name|prynyat |stageGod|stageMesyac|stageDen|stageGod|stageMesyac|stageDen |
|12/01/2007 | | | | | | |
можно ли реализовать код так, что при вводе даты наема в колонках отображался (автоматически) стаж в виде парсинга в ячейки стажа год, месяц, день??
если да, то подскажите как или где можно найти инфу...поясняющую как это можно реализовать
10.02.10 20:55: Перенесено модератором из '.NET' — TK
Здравствуйте, Ummon, Вы писали:
U>Здравствуйте, neytro, Вы писали:
U>Смотрите событие CellValueChange
смотрел... и что я там должен был увидеть???можно по подробнее?
Здравствуйте, Ummon, Вы писали:
U>Здравствуйте, neytro, Вы писали:
N>>смотрел... и что я там должен был увидеть???можно по подробнее?
U>
U>private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
U>{
U> if (dataGridView.Columns[e.ColumnIndex].Name == "columnExperience")
U> {
U> DateTime date = (DateTime)dataGridView.Rows[e.RowIndex].Cells["columnExperience"].Value; // получаем введенное значение
U> dataGridView.Rows[e.RowIndex].Cells["columnYear"].Value = ...; // устанавливаем какое-либо значение в столбец
U> }
U>}
U>
U>Как-то так. Только не забудь, что обращение идет по имени столбцов dataGridView, а не тех, что в наборе данных.
таки оно понятно...но....вопрос...(извини конечно)..а как в таком случае проставится автоматом значения полей год, месяц и день...в зависимости от установленного значения даты в ячейке принят на работу??????????
Здравствуйте, neytro, Вы писали:
N>вопрос: N>вот таблица грида N> |stag na etom predpriyatii | stag na drugom predpriyatii |summarny stag N>num|name|prynyat |stageGod|stageMesyac|stageDen|stageGod|stageMesyac|stageDen | N> |12/01/2007 | | | | | | |
N>можно ли реализовать код так, что при вводе даты наема в колонках отображался (автоматически) стаж в виде парсинга в ячейки стажа год, месяц, день?? N>если да, то подскажите как или где можно найти инфу...поясняющую как это можно реализовать
Я так понимаю, у вас две проблемы:
1) Как из двух дат получить количество лет, месяцев и дней, отражающих разницу между ними?
Используйте метод DateTime.Subtract (или просто оператор — (минус)).
Этот метод вернет вам структуру TimeSpan. У нее есть свойство TimeSpan.Days, из которого вы сможете получить годы, месяцы и дни.
2) Как обработать изменение ячейки, содержащей дату наема?
Правильнее всего обработать это событие в слое бизнес-логики. Например, если вы привязываете грид к коллекции объектов, то можно добавить в сеттер свойства ДатаНаема код, который вычислит и обновит соответствующие свойства СтажЛет, СтажМесяцев и т.п.
Однако, как мне кажется, никакого слоя БЛ у вас нет, и вы используете ДатаСеты, или вообще работаете со свободным гридом.
В Датасете, насколько я помню, есть событие изменения значения, и есть там еще метод, который можно перекрыть. Собственно, в них можно поместить обработку изменения значения.
Или же, как рекомендовали в ответе выше, использовать события грида.
Здравствуйте, neytro, Вы писали:
N>таки оно понятно...но....вопрос...(извини конечно)..а как в таком случае проставится автоматом значения полей год, месяц и день...в зависимости от установленного значения даты в ячейке принят на работу??????????
Здравствуйте, Ummon, Вы писали:
U>Здравствуйте, neytro, Вы писали:
N>>таки оно понятно...но....вопрос...(извини конечно)..а как в таком случае проставится автоматом значения полей год, месяц и день...в зависимости от установленного значения даты в ячейке принят на работу??????????
U>Ну как уже сказали, разница между введенной датой и текущей даст структуру TimeSpan, но сама по себе она не может вернуть количество лет/месяцев, поэтому придется написать метод. U>Одна из первых ссылок в гугле: http://urenjoy.blogspot.com/2009/03/convert-timespan-to-year-month-date-age.html
Скажите UMMON...ЕСЛИ Я ВАМ ВЫШЛЮ СВОЙ 1 ПРоект...вы сможете мне просто показать как реализвать это в датагриде, потому что в нем не реализуется сво-во Тект, я пробовал строиить структуру тимеспан((((если согласны..дайте свой маил, я вам вышлю целиком проект...посмотреть...
Здравствуйте, neytro, Вы писали:
N>Скажите UMMON...ЕСЛИ Я ВАМ ВЫШЛЮ СВОЙ 1 ПРоект...вы сможете мне просто показать как реализвать это в датагриде, потому что в нем не реализуется сво-во Тект, я пробовал строиить структуру тимеспан((((если согласны..дайте свой маил, я вам вышлю целиком проект...посмотреть...
В конструкторе формы после InitializeComponent(); подписываетесь на событие грида:
dataGridView.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);
Дальше у вас будет метод (взято из ссылки, что выше давал):
public void TimeSpanToDate(DateTime d1, DateTime d2, out int years, out int months, out int days)
{
// compute & return the difference of two dates,
// returning years, months & days
// d1 should be the larger (newest) of the two dates
// we want d1 to be the larger (newest) date
// flip if we need to if (d1 < d2)
{
DateTime d3 = d2;
d2 = d1;
d1 = d3;
}
// compute difference in total months
months = 12 * (d1.Year - d2.Year) + (d1.Month - d2.Month);
// based upon the 'days',
// adjust months & compute actual days difference if (d1.Day < d2.Day)
{
months--;
days = DateTime.DaysInMonth(d2.Year, d2.Month) - d2.Day + d1.Day;
}
else
{
days = d1.Day - d2.Day;
}
// compute years & actual months
years = months / 12;
months -= years * 12;
}
И рядом обработчик для события грида CellValueChanged:
private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (dataGridView.Columns[e.ColumnIndex].Name == "columnExperience")
{
DateTime date = (DateTime)dataGridView.Rows[e.RowIndex].Cells["columnExperience"].Value;
int years, months, days;
TimeSpanToDate(DateTime.Now, date, out years, out months, out days);
dataGridView.Rows[e.RowIndex].Cells["columnYear"].Value = years;
dataGridView.Rows[e.RowIndex].Cells["columnMonth"].Value = months;
dataGridView.Rows[e.RowIndex].Cells["columnDay"].Value = days;
}
}
Здравствуйте, Ummon, Вы писали:
U>Здравствуйте, neytro, Вы писали:
N>>Скажите UMMON...ЕСЛИ Я ВАМ ВЫШЛЮ СВОЙ 1 ПРоект...вы сможете мне просто показать как реализвать это в датагриде, потому что в нем не реализуется сво-во Тект, я пробовал строиить структуру тимеспан((((если согласны..дайте свой маил, я вам вышлю целиком проект...посмотреть...
U>В конструкторе формы после InitializeComponent(); подписываетесь на событие грида: U>
U>dataGridView.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);
U>
U>Дальше у вас будет метод (взято из ссылки, что выше давал): U>
U>public void TimeSpanToDate(DateTime d1, DateTime d2, out int years, out int months, out int days)
U>{
U> // compute & return the difference of two dates,
U> // returning years, months & days
U> // d1 should be the larger (newest) of the two dates
U> // we want d1 to be the larger (newest) date
U> // flip if we need to
U> if (d1 < d2)
U> {
U> DateTime d3 = d2;
U> d2 = d1;
U> d1 = d3;
U> }
U> // compute difference in total months
U> months = 12 * (d1.Year - d2.Year) + (d1.Month - d2.Month);
U> // based upon the 'days',
U> // adjust months & compute actual days difference
U> if (d1.Day < d2.Day)
U> {
U> months--;
U> days = DateTime.DaysInMonth(d2.Year, d2.Month) - d2.Day + d1.Day;
U> }
U> else
U> {
U> days = d1.Day - d2.Day;
U> }
U> // compute years & actual months
U> years = months / 12;
U> months -= years * 12;
U>}
U>
U>И рядом обработчик для события грида CellValueChanged: U>
U>private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
U>{
U> if (dataGridView.Columns[e.ColumnIndex].Name == "columnExperience")
U> {
U> DateTime date = (DateTime)dataGridView.Rows[e.RowIndex].Cells["columnExperience"].Value;
U> int years, months, days;
U> TimeSpanToDate(DateTime.Now, date, out years, out months, out days);
U> dataGridView.Rows[e.RowIndex].Cells["columnYear"].Value = years;
U> dataGridView.Rows[e.RowIndex].Cells["columnMonth"].Value = months;
U> dataGridView.Rows[e.RowIndex].Cells["columnDay"].Value = days;
U> }
U>}
U>
Здравствуйте, neytro, Вы писали:
N>Здравствуйте, Ummon, Вы писали:
U>>Здравствуйте, neytro, Вы писали:
N>>>Скажите UMMON...ЕСЛИ Я ВАМ ВЫШЛЮ СВОЙ 1 ПРоект...вы сможете мне просто показать как реализвать это в датагриде, потому что в нем не реализуется сво-во Тект, я пробовал строиить структуру тимеспан((((если согласны..дайте свой маил, я вам вышлю целиком проект...посмотреть...
U>>В конструкторе формы после InitializeComponent(); подписываетесь на событие грида: U>>
U>>dataGridView.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);
U>>
U>>Дальше у вас будет метод (взято из ссылки, что выше давал): U>>
U>>public void TimeSpanToDate(DateTime d1, DateTime d2, out int years, out int months, out int days)
U>>{
U>> // compute & return the difference of two dates,
U>> // returning years, months & days
U>> // d1 should be the larger (newest) of the two dates
U>> // we want d1 to be the larger (newest) date
U>> // flip if we need to
U>> if (d1 < d2)
U>> {
U>> DateTime d3 = d2;
U>> d2 = d1;
U>> d1 = d3;
U>> }
U>> // compute difference in total months
U>> months = 12 * (d1.Year - d2.Year) + (d1.Month - d2.Month);
U>> // based upon the 'days',
U>> // adjust months & compute actual days difference
U>> if (d1.Day < d2.Day)
U>> {
U>> months--;
U>> days = DateTime.DaysInMonth(d2.Year, d2.Month) - d2.Day + d1.Day;
U>> }
U>> else
U>> {
U>> days = d1.Day - d2.Day;
U>> }
U>> // compute years & actual months
U>> years = months / 12;
U>> months -= years * 12;
U>>}
U>>
U>>И рядом обработчик для события грида CellValueChanged: U>>
U>>private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
U>>{
U>> if (dataGridView.Columns[e.ColumnIndex].Name == "columnExperience")
U>> {
U>> DateTime date = (DateTime)dataGridView.Rows[e.RowIndex].Cells["columnExperience"].Value;
U>> int years, months, days;
U>> TimeSpanToDate(DateTime.Now, date, out years, out months, out days);
U>> dataGridView.Rows[e.RowIndex].Cells["columnYear"].Value = years;
U>> dataGridView.Rows[e.RowIndex].Cells["columnMonth"].Value = months;
U>> dataGridView.Rows[e.RowIndex].Cells["columnDay"].Value = days;
U>> }
U>>}
U>>
N>спасибо ушол пробовать....)))))))))))))))
вообще беда стала(((dataGridView.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged); — и отвалилась строка соединения с базой данных, она перестала читаться и не видит датасета и таблоадаптера(((((шо делать???((((((
Здравствуйте, sto, Вы писали:
sto>Здравствуйте, neytro, Вы писали:
N>>вопрос: N>>вот таблица грида N>> |stag na etom predpriyatii | stag na drugom predpriyatii |summarny stag N>>num|name|prynyat |stageGod|stageMesyac|stageDen|stageGod|stageMesyac|stageDen | N>> |12/01/2007 | | | | | | |
N>>можно ли реализовать код так, что при вводе даты наема в колонках отображался (автоматически) стаж в виде парсинга в ячейки стажа год, месяц, день?? N>>если да, то подскажите как или где можно найти инфу...поясняющую как это можно реализовать
sto>Я так понимаю, у вас две проблемы: sto>1) Как из двух дат получить количество лет, месяцев и дней, отражающих разницу между ними? sto> Используйте метод DateTime.Subtract (или просто оператор — (минус)). sto> Этот метод вернет вам структуру TimeSpan. У нее есть свойство TimeSpan.Days, из которого вы сможете получить годы, месяцы и дни.
sto>2) Как обработать изменение ячейки, содержащей дату наема? sto> Правильнее всего обработать это событие в слое бизнес-логики. Например, если вы привязываете грид к коллекции объектов, то можно добавить в сеттер свойства ДатаНаема код, который вычислит и обновит соответствующие свойства СтажЛет, СтажМесяцев и т.п. sto> Однако, как мне кажется, никакого слоя БЛ у вас нет, и вы используете ДатаСеты, или вообще работаете со свободным гридом. sto> В Датасете, насколько я помню, есть событие изменения значения, и есть там еще метод, который можно перекрыть. Собственно, в них можно поместить обработку изменения значения. sto> Или же, как рекомендовали в ответе выше, использовать события грида.
не так...дата наема допустим 7 февраля 2000 года, то стаж год — 7 лет, стаж месяц — 0, стаж день -0....БЛ у меня нет, ятолько недавно увлекся программированием всерьез...как написать этот сеттер?..приблизительно?
Re[10]: работа с датетаймом в датагрид вью!
От:
Аноним
Дата:
12.02.10 15:30
Оценка:
Здравствуйте, neytro, Вы писали:
N>Здравствуйте, neytro, Вы писали:
N>>Здравствуйте, Ummon, Вы писали:
U>>>Здравствуйте, neytro, Вы писали:
N>>>>Скажите UMMON...ЕСЛИ Я ВАМ ВЫШЛЮ СВОЙ 1 ПРоект...вы сможете мне просто показать как реализвать это в датагриде, потому что в нем не реализуется сво-во Тект, я пробовал строиить структуру тимеспан((((если согласны..дайте свой маил, я вам вышлю целиком проект...посмотреть...
U>>>В конструкторе формы после InitializeComponent(); подписываетесь на событие грида: U>>>
U>>>dataGridView.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);
U>>>
U>>>Дальше у вас будет метод (взято из ссылки, что выше давал): U>>>
U>>>public void TimeSpanToDate(DateTime d1, DateTime d2, out int years, out int months, out int days)
U>>>{
U>>> // compute & return the difference of two dates,
U>>> // returning years, months & days
U>>> // d1 should be the larger (newest) of the two dates
U>>> // we want d1 to be the larger (newest) date
U>>> // flip if we need to
U>>> if (d1 < d2)
U>>> {
U>>> DateTime d3 = d2;
U>>> d2 = d1;
U>>> d1 = d3;
U>>> }
U>>> // compute difference in total months
U>>> months = 12 * (d1.Year - d2.Year) + (d1.Month - d2.Month);
U>>> // based upon the 'days',
U>>> // adjust months & compute actual days difference
U>>> if (d1.Day < d2.Day)
U>>> {
U>>> months--;
U>>> days = DateTime.DaysInMonth(d2.Year, d2.Month) - d2.Day + d1.Day;
U>>> }
U>>> else
U>>> {
U>>> days = d1.Day - d2.Day;
U>>> }
U>>> // compute years & actual months
U>>> years = months / 12;
U>>> months -= years * 12;
U>>>}
U>>>
U>>>И рядом обработчик для события грида CellValueChanged: U>>>
U>>>private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
U>>>{
U>>> if (dataGridView.Columns[e.ColumnIndex].Name == "columnExperience")
U>>> {
U>>> DateTime date = (DateTime)dataGridView.Rows[e.RowIndex].Cells["columnExperience"].Value;
U>>> int years, months, days;
U>>> TimeSpanToDate(DateTime.Now, date, out years, out months, out days);
U>>> dataGridView.Rows[e.RowIndex].Cells["columnYear"].Value = years;
U>>> dataGridView.Rows[e.RowIndex].Cells["columnMonth"].Value = months;
U>>> dataGridView.Rows[e.RowIndex].Cells["columnDay"].Value = days;
U>>> }
U>>>}
U>>>
N>>спасибо ушол пробовать....))))))))))))))) N>вообще беда стала(((dataGridView.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged); — и отвалилась строка соединения с базой данных, она перестала читаться и не видит датасета и таблоадаптера(((((шо делать???((((((
разобрался)))...но вопрос..при попытке вставить дату в ячейку принят, вываливается ексепшн "приведенная строка не действительна"...что можно сделать?