2012-08-28 53 views
0

我創建了一個相當簡單的窗體;它會打開一個Excel文件,並根據該電子表格的內容填充數據表。完成版本1,測試,調試 - 並且工作正常。加載功能完成後,我的表單上的datagridview將顯示數據。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 
     { 
     } 
    } 

而且從Load按鈕,實際上分析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; 

對應於新驗證按鈕的新行將在該塊之後添加,如果相關的話。

我明顯在我的頭上,在這裏;我做了一些事情,不知何故,在某個地方 - 但根本無法想象什麼,也不知道如何克服這一點。 (幸運的是,原始的和修改過的版本都創建一個我需要的輸出,所以它不是緊迫 - 但它驅使我堅果,網格將不顯示我的數據!)

謝謝!

+0

我忘了兩行代碼,從頂部開始:DataSet dsScanRows; DataTable dtScanTable; –

+0

另一個更新;我爲Form Closing事件添加了一個處理程序,並且 - 數據再次停止顯示在網格中。然後,我比較了新版本和之前版本的FormDesigner.cs - 新版本不再擁有數據網格columsn的大部分(任何?)定義;他們消失了。使用超越比較(無恥插入一個驚人的工具!),我剛剛從舊的表單設計代碼複製這些代碼行 - 數據再次出現。 –

+0

所以現在,問題似乎是 - 爲什麼每當我向表單添加新元素時,表單設計代碼的這一部分都會消失? (仍然,「我做錯了什麼?怎麼?」) –

回答

0

它再次發生了 - 顯然,有一個在VS中的錯誤(我使用的是2012了,但原來的出現,上面是VS2010)。我不知道這是否只會在代碼中定義datagridview屬性時纔會出現,或者它總是會發生 - 但是向表單中添加另一個控件從FormDesigner.cs中刪除了一堆代碼,並且只需要將它放入背部。

因此,該解決方案包括:(1)具有一個備份拷貝和(2)使用良好的文本比較工具。

相關問題