#c# #visual-studio #datetime #datetimepicker #date-formatting
#c# #visual-studio #datetime #datetimepicker #дата-форматирование
Вопрос:
Да, я знаю, что с этим вопросом много тем, я искал и видел их много, но я все еще не могу решить свою проблему.
ОШИБКА: строка не была распознана как допустимая дата и время
Я получаю данные из datagridview, который находится в другой форме, я получаю его и могу отображать его просто отлично, но теперь я хочу скрыть данные, которые находятся в строковом формате, в формат даты и отобразить их в формах datetimepickers.
Получение данных:
public EditObras(string id, string NomeObra, string idCliente, string DataPLevantamento, string DataRLevantamento, string Estado, string DataRMateriais, string DataInicioObra, string DataConclusao, string DataVestoria, string Obs, string Prompor, string Levantpor, string executpor)
{
InitializeComponent();
label4.Text = (string)id;
textBox1.Text = (string)NomeObra;
textBox2.Text = (string)idCliente;
dateTimePicker1.Value = DateTime.ParseExact(DataPLevantamento, "d' de 'MMMM' de 'yyyy", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None);
// textBox3.Text = (string)DataPLevantamento;
textBox4.Text = (string)DataRLevantamento;
comboBox1.Text = (string)Estado;
textBox5.Text = (string)DataRMateriais;
textBox6.Text = (string)DataInicioObra;
textBox7.Text = (string)DataConclusao;
textBox8.Text = (string)DataVestoria;
textBox12.Text = (string)Obs;
textBox9.Text = (string)Prompor;
textBox10.Text = (string)Levantpor;
textBox11.Text = (string)executpor;
}
Я получаю ошибку в этой строке:
dateTimePicker1.Value = DateTime.ParseExact(DataPLevantamento, "d' de 'MMMM' de 'yyyy", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None);
Формат «d ‘ de’MMMM’ de ‘гггг» — это тот, который я использую, я получил формат таким образом, просто чтобы посмотреть, что это за формат:
string datePattern = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern;
textBox1.Text = datePattern;
Значение DataPLevantamento — это данные, подобные этому:
30 de outubro de 2016
Стек исключений:
System.FormatException was unhandled
HResult=-2146233033
Message=A cadeia de caracteres não foi reconhecida como valor DateTime válido.
Source=mscorlib
StackTrace:
em System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)
em System.DateTime.ParseExact(String s, String format, IFormatProvider provider, DateTimeStyles style)
em GestãodeobrasGasFenosa.EditObras..ctor(String id, String NomeObra, String idCliente, String DataPLevantamento, String DataRLevantamento, String Estado, String DataRMateriais, String DataInicioObra, String DataConclusao, String DataVestoria, String Obs, String Prompor, String Levantpor, String executpor) em C:UsersBugDroidDocumentsVisual Studio 2015ProjectsGestãodeobrasGasFenosaGestãodeobrasGasFenosaEditObras.cs:line 26
em GestãodeobrasGasFenosa.Form1.dataGridView1_CellDoubleClick(Object sender, DataGridViewCellEventArgs e) em C:UsersBugDroidDocumentsVisual Studio 2015ProjectsGestãodeobrasGasFenosaGestãodeobrasGasFenosaForm1.cs:line 606
em System.Windows.Forms.DataGridView.OnCellDoubleClick(DataGridViewCellEventArgs e)
em System.Windows.Forms.DataGridView.OnDoubleClick(EventArgs e)
em System.Windows.Forms.Control.WmMouseUp(Messageamp; m, MouseButtons button, Int32 clicks)
em System.Windows.Forms.Control.WndProc(Messageamp; m)
em System.Windows.Forms.DataGridView.WndProc(Messageamp; m)
em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Messageamp; m)
em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Messageamp; m)
em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
em System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSGamp; msg)
em System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
em System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
em System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
em System.Windows.Forms.Application.Run(Form mainForm)
em GestãodeobrasGasFenosa.Program.Main() em C:UsersBugDroidDocumentsVisual Studio 2015ProjectsGestãodeobrasGasFenosaGestãodeobrasGasFenosaProgram.cs:line 19
em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
em System.Threading.ThreadHelper.ThreadStart_Context(Object state)
em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
em System.Threading.ThreadHelper.ThreadStart()
InnerException:
Комментарии:
1. Хорошо, какое значение вы пытаетесь проанализировать?
2. Пожалуйста, добавьте строковое значение
DataPLevantamento
в вопрос и сообщите нам ваше фактическое значениеCultureInfo.CurrentCulture
. Тогда вы, вероятно, сможете удалить около 90% своего кода, потомуDateTime.ParseExact("Value of DataPLevantamento", "d' de 'MMMM' de 'yyyy", (Value of CultureInfo.CurrentCulture), DateTimeStyles.None)
что вопрос должен быть разрешимым независимо от контекста.3. Что вы передаете в DataPLevantamento ?? Вы не ответили @LasseV.Karlsen , спросили вас образец данных, которые вы передаете там в виде строки. Кроме того, вам следует рассмотреть возможность передачи класса этому конструктору. Что-то вроде: public EditObras(Obras obra)
4. какое значение
DataPLevantamento
?5. Вы уверены, что
CultureInfo.CurrentUICulture
иCultureInfo.CurrentCulture
совпадают? (поскольку вы используете оба в своем вопросе)
Ответ №1:
Это связано с тем, что фактические CultureInfo
CultureInfo
потребности должны быть равны вашим, поэтому вы должны создать новую CultureInfo
переменную.
Я догадался, что этот язык был португальским.
string DataPLevantamento = "30 de outubro de 2016";
var provider = new System.Globalization.CultureInfo("pt-PT");
string result = DateTime.ParseExact(DataPLevantamento,
"d' de 'MMMM' de 'yyyy",
provider,
System.Globalization.DateTimeStyles.None).ToString();
Console.WriteLine(result);
Комментарии:
1. @BugDroid777 Не могли бы вы отправить трассировку стека исключений, пожалуйста? Это странно, поскольку это работает с .NET Fiddle
2. Добавил сообщение, я думаю, это то, о чем вы просили.
3. @BugDroid777 вы получаете ту же ошибку при выполнении в точности кода этого ответа или при попытке использовать ответ в своем коде?
Ответ №2:
Попробуйте этот способ, используя пользовательский язык
CultureInfo culture = new CultureInfo("pt-PT");
dateTimePicker1.Value = DateTime.ParseExact(DataPLevantamento, "d' de 'MMMM' de 'yyyy",
culture, System.Globalization.DateTimeStyles.None);
Комментарии:
1. это отличное счастливое кодирование 🙂