我创建了一个相当简单的表单;它会打开一个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;
如果相关,则在该块之后添加与新验证按钮对应的新行。
我显然在我的头上,在这里;我已经做了某种事情,某种程度上,在某个地方 - 但根本无法想象什么,也不知道如何超越这个。 (幸运的是,原始版本和修改版本都创建了我需要的输出,所以它并不紧急 - 但它让我疯狂,网格不会显示我的数据!)
谢谢!
答案 0 :(得分:0)
它再次发生 - 显然,VS中存在一个错误(我现在正在使用2012,但上面的原始发生是VS2010)。我不知道这是否只会在你在代码中定义datagridview属性时显示,或者它是否总是发生 - 但是在我的表单中添加另一个控件会从FormDesigner.cs中删除一堆代码,你只需要将它放入回来。
因此,该解决方案涉及(1)备份副本和(2)使用良好的文本比较工具。