работа с датетаймом в датагрид вью!
От: neytro  
Дата: 10.02.10 15:55
Оценка:
вопрос:
вот таблица грида
|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
Re: работа с датетаймом в датагрид вью!
От: Ummon Россия  
Дата: 10.02.10 17:11
Оценка:
Здравствуйте, neytro, Вы писали:

Смотрите событие CellValueChanged.
Re[2]: работа с датетаймом в датагрид вью!
От: neytro  
Дата: 10.02.10 18:05
Оценка:
Здравствуйте, Ummon, Вы писали:

U>Здравствуйте, neytro, Вы писали:


U>Смотрите событие CellValueChange

смотрел... и что я там должен был увидеть???можно по подробнее?
Re[3]: работа с датетаймом в датагрид вью!
От: Ummon Россия  
Дата: 11.02.10 04:19
Оценка:
Здравствуйте, neytro, Вы писали:

N>смотрел... и что я там должен был увидеть???можно по подробнее?


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; // получаем введенное значение
        dataGridView.Rows[e.RowIndex].Cells["columnYear"].Value = ...; // устанавливаем какое-либо значение в столбец
    }
}


Как-то так. Только не забудь, что обращение идет по имени столбцов dataGridView, а не тех, что в наборе данных.
Re[4]: работа с датетаймом в датагрид вью!
От: neytro  
Дата: 11.02.10 11:18
Оценка:
Здравствуйте, 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, а не тех, что в наборе данных.

таки оно понятно...но....вопрос...(извини конечно)..а как в таком случае проставится автоматом значения полей год, месяц и день...в зависимости от установленного значения даты в ячейке принят на работу??????????
Re: работа с датетаймом в датагрид вью!
От: sto Украина http://overstore.codeplex.com
Дата: 11.02.10 12:53
Оценка:
Здравствуйте, 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) Как обработать изменение ячейки, содержащей дату наема?
Правильнее всего обработать это событие в слое бизнес-логики. Например, если вы привязываете грид к коллекции объектов, то можно добавить в сеттер свойства ДатаНаема код, который вычислит и обновит соответствующие свойства СтажЛет, СтажМесяцев и т.п.
Однако, как мне кажется, никакого слоя БЛ у вас нет, и вы используете ДатаСеты, или вообще работаете со свободным гридом.
В Датасете, насколько я помню, есть событие изменения значения, и есть там еще метод, который можно перекрыть. Собственно, в них можно поместить обработку изменения значения.
Или же, как рекомендовали в ответе выше, использовать события грида.
There is no such thing as the perfect design.
Re[5]: работа с датетаймом в датагрид вью!
От: Ummon Россия  
Дата: 11.02.10 13:21
Оценка:
Здравствуйте, neytro, Вы писали:

N>таки оно понятно...но....вопрос...(извини конечно)..а как в таком случае проставится автоматом значения полей год, месяц и день...в зависимости от установленного значения даты в ячейке принят на работу??????????


Ну как уже сказали, разница между введенной датой и текущей даст структуру TimeSpan, но сама по себе она не может вернуть количество лет/месяцев, поэтому придется написать метод.
Одна из первых ссылок в гугле: http://urenjoy.blogspot.com/2009/03/convert-timespan-to-year-month-date-age.html
Re[6]: работа с датетаймом в датагрид вью!
От: neytro  
Дата: 11.02.10 14:41
Оценка:
Здравствуйте, Ummon, Вы писали:

U>Здравствуйте, neytro, Вы писали:


N>>таки оно понятно...но....вопрос...(извини конечно)..а как в таком случае проставится автоматом значения полей год, месяц и день...в зависимости от установленного значения даты в ячейке принят на работу??????????


U>Ну как уже сказали, разница между введенной датой и текущей даст структуру TimeSpan, но сама по себе она не может вернуть количество лет/месяцев, поэтому придется написать метод.

U>Одна из первых ссылок в гугле: http://urenjoy.blogspot.com/2009/03/convert-timespan-to-year-month-date-age.html
Скажите UMMON...ЕСЛИ Я ВАМ ВЫШЛЮ СВОЙ 1 ПРоект...вы сможете мне просто показать как реализвать это в датагриде, потому что в нем не реализуется сво-во Тект, я пробовал строиить структуру тимеспан((((если согласны..дайте свой маил, я вам вышлю целиком проект...посмотреть...
Re[7]: работа с датетаймом в датагрид вью!
От: Ummon Россия  
Дата: 11.02.10 15:15
Оценка:
Здравствуйте, 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;
    }
}
Re[8]: работа с датетаймом в датагрид вью!
От: neytro  
Дата: 11.02.10 17:23
Оценка:
Здравствуйте, 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>

спасибо ушол пробовать....)))))))))))))))
Re[9]: работа с датетаймом в датагрид вью!
От: neytro  
Дата: 11.02.10 18:23
Оценка:
Здравствуйте, 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); — и отвалилась строка соединения с базой данных, она перестала читаться и не видит датасета и таблоадаптера(((((шо делать???((((((
Re[2]: работа с датетаймом в датагрид вью!
От: neytro  
Дата: 11.02.10 18:26
Оценка:
Здравствуйте, 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); — и отвалилась строка соединения с базой данных, она перестала читаться и не видит датасета и таблоадаптера(((((шо делать???((((((
разобрался)))...но вопрос..при попытке вставить дату в ячейку принят, вываливается ексепшн "приведенная строка не действительна"...что можно сделать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.