DataGridView没有列。

4
这是c#的Windows表单。
我有一个数据网格视图,应该显示两列,文件名和修改日期。我通过一个任务来实现这个目的。我还有一个只保存文件和路径名、绑定源和数据网格视图的类。这个任务运行一个方法,传递这个类。一旦任务完成,这个类应该有一个网格视图,然后我可以将它设置回表单上的网格视图。
这个类看起来像这样:
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
我不太清楚。你是否在使用异步方法? - Chris
非常抱歉我对你的问题不够了解。这是我第一次使用任务,打算通过传递先前实例化的类来调用一个方法。那部分似乎已经起作用了。我想包括这个信息是因为我希望每个人都能充分理解正在发生的事情。 - hondaman2003
可能是我的无知...你能试着将这些代码行移动到DataGridView.DataBindingComplete事件中吗?FormFields.GridView.Columns[0].Width = (FormFields.GridView.Width / 10) * 6; FormFields.GridView.Columns[1].Width = (FormFields.GridView.Width / 10) * 4; - Chris
那个可行。有趣的是,在分配数据源之后,数据网格视图似乎没有设置好,以便您能够操作应自动生成的列。但是,我也相信将这种类型的代码放在那个位置更好组织。 - hondaman2003
你可以把它作为一个答案发布吗,这样我就可以投票支持了吗? - hondaman2003
1个回答

3
我猜(我不太明白为什么)您试图访问还不存在的列。
请尝试将这些代码移动到DataGridView.DataBindingComplete事件中。
FormFields.GridView.Columns[0].Width = (FormFields.GridView.Width / 10) * 6; 
FormFields.GridView.Columns[1].Width = (FormFields.GridView.Width / 10) * 4;

我曾经以为在我分配数据源后它们会存在。我还没有完全理解 datagridview。你的建议非常有效。谢谢! - hondaman2003
我需要更多的声望才能投票支持这个。 - hondaman2003

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接