我創建了一個相當簡單的窗體;它會打開一個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;
對應於新驗證按鈕的新行將在該塊之後添加,如果相關的話。
我明顯在我的頭上,在這裏;我做了一些事情,不知何故,在某個地方 - 但根本無法想象什麼,也不知道如何克服這一點。 (幸運的是,原始的和修改過的版本都創建一個我需要的輸出,所以它不是緊迫 - 但它驅使我堅果,網格將不顯示我的數據!)
謝謝!
我忘了兩行代碼,從頂部開始:DataSet dsScanRows; DataTable dtScanTable; –
另一個更新;我爲Form Closing事件添加了一個處理程序,並且 - 數據再次停止顯示在網格中。然後,我比較了新版本和之前版本的FormDesigner.cs - 新版本不再擁有數據網格columsn的大部分(任何?)定義;他們消失了。使用超越比較(無恥插入一個驚人的工具!),我剛剛從舊的表單設計代碼複製這些代碼行 - 數據再次出現。 –
所以現在,問題似乎是 - 爲什麼每當我向表單添加新元素時,表單設計代碼的這一部分都會消失? (仍然,「我做錯了什麼?怎麼?」) –