DataGridView не имеет столбцов
Это C# окна формы.
У меня есть представление сетки данных, которое должно отображать два столбца, имена файлов и дату изменения. Я делаю это через задачу. У меня также есть класс, который содержит только имя файла и пути, источник привязки и представление сетки данных. Эта задача запускает метод, в котором передается класс. Как только задача будет завершена, у класса должен появиться вид сетки, который я затем смогу вернуть в форму в виде сетки.
Класс выглядит так:
class GetLogFilesParameters
{
public string FileNameandPath;
public BindingSource BindingSource;
public DataGridView GridView;
public GetLogFilesParameters(string _fileNameAndPath)
{
FileNameandPath = _fileNameAndPath;
BindingSource = new BindingSource();
GridView = new DataGridView();
GridView.DataSource = BindingSource;
}
}
Метод, который вызывает моя задача, выглядит следующим образом:
private static void GetLogFilesTest(GetLogFilesParameters FormFields)
{
Cursor.Current = Cursors.WaitCursor;
try
{
//Setup data table
DataTable FileList = new DataTable();
FileList.Clear();
DataColumn FileNameColumn = new DataColumn();
FileNameColumn.ColumnName = "FileName";
FileNameColumn.DataType = System.Type.GetType("System.String");
DataColumn DateColumn = new DataColumn();
DateColumn.ColumnName = "ModifiedDate";
DateColumn.DataType = System.Type.GetType("System.DateTime");
FileList.Columns.Add(FileNameColumn);
FileList.Columns.Add(DateColumn);
//Get a list of files in a directory
string[] files = Directory.GetFiles(FormFields.FileNameandPath, "*.log");
//Loop through the files and fill the data table with a row for each
foreach (string file in files)
{
FileInfo FileInformation = new FileInfo(file);
DataRow row = FileList.NewRow();
row["FileName"] = FileInformation.Name;
row["ModifiedDate"] = FileInformation.LastWriteTime;
FileList.Rows.Add(row);
}
//FormFields.GridView.Columns.Add("FileName", "File Name");
//FormFields.GridView.Columns.Add("ModifiedDate", "Modified Date");
FormFields.GridView.AutoGenerateColumns = true;
//Setup the binding source
FormFields.BindingSource.DataSource = FileList;
FormFields.BindingSource.Sort = "ModifiedDate DESC";
FormFields.GridView.Columns[0].Width = (FormFields.GridView.Width / 10) * 6;
FormFields.GridView.Columns[1].Width = (FormFields.GridView.Width / 10) * 4;
}
catch (Exception ex)
{
string ErrorText = "Error trying to get the list of log files." + Environment.NewLine + Environment.NewLine;
ExceptionLogger.LogIt(ErrorText, "Exception");
MessageBox.Show(ErrorText + ex.ToString());
}
finally
{
Cursor.Current = Cursors.Default;
}
}
Моя задача выглядит так:
GetLogFilesParameters GetLogFilesParameters = new GetLogFilesParameters(EpicorSenderPath);
Task tGetFiles1 = new Task(() => GetLogFilesTest(GetLogFilesParameters));
tGetFiles1.Start();
tGetFiles1.ContinueWith((antecedent) =>
{
gvEpicorSenderFiles = GetLogFilesParameters.GridView;
}, TaskScheduler.FromCurrentSynchronizationContext());
Я получаю ошибку System.ArgumentOutOfRangeException: индекс вышел за пределы допустимого диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Это происходит в методе в этой строке:
FormFields.GridView.Columns[0].Width = (FormFields.GridView.Width / 10) * 6;
Это происходит потому, что у gridview нет столбцов в соответствии с отладкой. Кроме того, когда он имеет строки и данные. Я не знаю, что не так.
1 ответ
Я думаю (я не понимаю, почему именно) вы пытаетесь получить доступ к столбцам, которые еще не существуют.
Попробуйте переместить эти строки кода в событие DataGridView.DataBindingComplete
FormFields.GridView.Columns[0].Width = (FormFields.GridView.Width / 10) * 6;
FormFields.GridView.Columns[1].Width = (FormFields.GridView.Width / 10) * 4;