更改表单控件后,DataGridView停止显示

时间:2012-08-28 18:45:16

标签: datagridview datatable

我创建了一个相当简单的表单;它会打开一个Excel文件,并根据该电子表格的内容填充数据表。完成版本1,测试,调试 - 它工作正常。加载功能完成后,表单上的datagridview将显示数据。

版本2需要一个“验证”按钮,后面有逻辑,所以我添加了,测试,调试......并注意到数据不再出现在datagridview中。我没有看到我为改变加载逻辑,表格定义等所做的任何事情。

所以,我恢复了版本1的保存副本(为什么,是的,我以前做过这个 - 嘿!);它仍然像以前一样工作,在加载结束时显示数据。

只要我向表单添加任何控件,就不再显示数据。有趣的是,我在Form1.Designer.cs中也收到了一堆警告:从不使用字段'CSVScanApp.Form1.FileName' 有趣/巧合地重复数据表中的每一列。

我知道你会想看到代码,所以这里是:

    public Form1()
    {
        try
        {
            InitializeComponent();
            cxApp = new cExcel.Application();
            dsScanRows = new DataSet();
            dtScanTable = dsScanRows.Tables.Add();
            dtScanTable.Columns.Add("FileName", typeof(string));
            dtScanTable.Columns.Add("Company", typeof(string));
            dtScanTable.Columns.Add("LeaseNo", typeof(string));
            dtScanTable.Columns.Add("DocDate", typeof(string));
            dtScanTable.Columns.Add("Function", typeof(string));
            dtScanTable.Columns.Add("Category", typeof(string));
            dtScanTable.Columns.Add("DocType", typeof(string));
            dtScanTable.Columns.Add("Integration", typeof(string));
            dtScanTable.Columns.Add("ScanDate", typeof(string));
            // Category "codes" and their corresponding full names
            CtgyDict.Add("DataSheet", "Data Sheet");
            CtgyDict.Add("Surface", "Surface/ROW/Pipeline Agreements");
            CtgyDict.Add("TitleReport", "Title Report");
            CtgyDict.Add("MapPlats", "Map & Plats");

        }
        catch (Exception ex)
        {
            MessageBox.Show("Error(s) encountered:" + crlf + ex.Message);
        }
        finally
        {
        }
    }

来自“加载”按钮的逻辑,它实际上将Excel解析为数据表:

    private void btnLoad_Click(object sender, EventArgs e)
    {
        try
        {
            cxWB = cxApp.Workbooks.Open(tbSourceFile.Text, 0, true, 5, "", "", true,
                cExcel.XlPlatform.xlWindows, "", false, false, 0, false, 1, 0); // open Read-Only
            cExcel.Sheets cxSheets = cxWB.Worksheets;
            cExcel._Worksheet cxSheet = (cExcel._Worksheet)cxSheets.get_Item(1); // Sheet 1
            cExcel.Range cxRange = cxSheet.UsedRange;
            int iRowMax = cxRange.Rows.Count;
            int iRow;
            string sFileName, sLease,sDocDate,sCategory,sCtgyName,sDocType;
            Double dblDocDate;
            string sCompany = tbCompany.Text; // specs said "CompanyNN", but were wrong...
            string sScanDate = tbScanDate.Text; // hope it's correctly entered...  :p
            dataGridView1.DataSource = null; // reset from any previous data
            dtScanTable.Clear(); // make sure this starts empty
            // loop through each row in the source
            for (iRow = 2; iRow <= iRowMax; iRow++)
            {
                sFileName = (string)(cxRange.Cells[iRow, iSourceColFileName] as cExcel.Range).Value2;
                if (sFileName == null | sFileName == "")
                { } // ignore blank rows
                else
                {
                    sLease = sFileName.Split('_')[0]; // e.g., 100845.00A_1.pdf --> 100845.00A
                    dblDocDate = Convert.ToDouble((cxRange.Cells[iRow, iSourceColDocDate] as cExcel.Range).Value2);
                    sDocDate = DateTime.FromOADate(dblDocDate).ToShortDateString();
                    //if (sDocDate == "") { sDocDate = sScanDate; } // default to today???
                    sCategory = (string)(cxRange.Cells[iRow, iSourceColCtgy] as cExcel.Range).Value2;
                    try
                    {
                        sCtgyName = CtgyDict[sCategory];
                    }
                    catch
                    {
                        sCtgyName = sCategory; // i.e., not in the replacement list
                    }
                    sDocType = (string)(cxRange.Cells[iRow, iSourceColDocType] as cExcel.Range).Value2;
                    dtScanTable.Rows.Add(sFileName,sCompany,sLease,sDocDate,sFunction,sCtgyName,sDocType,sIntegration,sScanDate);
                }
            }
            dataGridView1.DataSource = dtScanTable;
            btnValidate.Enabled = true;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error(s) encountered:" + crlf + ex.Message);
            btnSave.Enabled = false;
        }
    }

并且,在Form1.Designer.cs中,这些是与警告相关联的行,这些警告仅在我向表单添加控件后显示:

    private System.Windows.Forms.DataGridViewTextBoxColumn FileName;
    private System.Windows.Forms.DataGridViewTextBoxColumn Company;
    private System.Windows.Forms.DataGridViewTextBoxColumn LeaseNo;
    private System.Windows.Forms.DataGridViewTextBoxColumn DocDate;
    private System.Windows.Forms.DataGridViewTextBoxColumn Function;
    private System.Windows.Forms.DataGridViewTextBoxColumn Category;
    private System.Windows.Forms.DataGridViewTextBoxColumn DocType;
    private System.Windows.Forms.DataGridViewTextBoxColumn Integration;
    private System.Windows.Forms.DataGridViewTextBoxColumn ScanDate;

如果相关,则在该块之后添加与新验证按钮对应的新行。

我显然在我的头上,在这里;我已经做了某种事情,某种程度上,在某个地方 - 但根本无法想象什么,也不知道如何超越这个。 (幸运的是,原始版本和修改版本都创建了我需要的输出,所以它并不紧急 - 但它让我疯狂,网格不会显示我的数据!)

谢谢!

1 个答案:

答案 0 :(得分:0)

它再次发生 - 显然,VS中存在一个错误(我现在正在使用2012,但上面的原始发生是VS2010)。我不知道这是否只会在你在代码中定义datagridview属性时显示,或者它是否总是发生 - 但是在我的表单中添加另一个控件会从FormDesigner.cs中删除一堆代码,你只需要将它放入回来。

因此,该解决方案涉及(1)备份副本和(2)使用良好的文本比较工具。