0

かなり単純なフォームを作成しました。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;

関連する場合は、新しい[検証]ボタンに対応する新しい行がそのブロックの後に追加されます。

ここで、私は明らかに頭を抱えています。私はどこかで何かをしましたが、何を想像することも、これをどのように乗り越えるかを想像することもできません。(幸い、元のバージョンと変更されたバージョンの両方で必要な出力が作成されるため、緊急ではありませんが、グリッドにデータが表示されないことに気が狂います!)

ありがとう!

4

1 に答える 1

0

再び発生しました-明らかに、VSにバグがあります(私は現在2012を使用していますが、上記の最初の発生はVS2010でした)。これがコードで datagridview プロパティを定義した場合にのみ発生するのか、それとも常に発生するのかはわかりませんが、別のコントロールをフォームに追加すると、FormDesigner.cs から大量のコードが消去され、それを配置するだけで済みます。戻る。

したがって、解決策には、(1) バックアップ コピーを用意することと、(2) 適切なテキスト比較ツールを使用することが含まれます。

于 2013-09-26T15:12:13.910 に答える