0

変数 "doc" は、if ステートメント以外のメソッド内の他の場所にはアクセスできないため、if doc==null は失敗します。これは、"doc" のスコープが、それが定義されている if ステートメント内にのみあるためです....方法私はこの問題に対処しますか?public を追加すると、エラーが増えるだけです..

protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            string id, type, UniqueColID;
            string FilePath = Server.MapPath("~").ToString();
            type = Request.QueryString["type"];

            if (type.Equals("template"))
            {
                MergeDocument template = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");
                template.DrawToWeb();
            }
            else
            {
                id = Request.QueryString["id"];
                UniqueColID = DBFunctions.DBFunctions.testExist(id);
                if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false)
                {
                    MergeDocument doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID);
                }
                else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true)
                {
                    MergeDocument doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID);
                }
                DBFunctions.DBFunctions.FlagDriverPrintOnly = false;
                    if (doc == null)
                    doc = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");

                doc.DrawToWeb();
            }
        }
        catch(Exception err)
        {
            MessageBox("Creating PDF file was not successful. " + err.ToString());
        }

より高いレベルで宣言しようとしましたが、それでも同じエラーが発生します:

**Use of unassigned local variable 'doc' -->>>at: if (doc==nul)**   

MergeDocument=null; を実行した後。より高いレベルでは、新しいエラーが発生します:

System.NullReferenceException: Object reference not set to an instance of an object. at GeneratePDF.Page_Load(Object sender, EventArgs e)

このエラーは"if (type.Equals("template"))"

4

8 に答える 8

1

簡単な方法。これを試して:

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        string id, type, UniqueColID;
        string FilePath = Server.MapPath("~").ToString();
        type = Request.QueryString["type"];

        if (type.Equals("template"))
        {
            MergeDocument template = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");
            template.DrawToWeb();
        }
        else
        {
            id = Request.QueryString["id"];
            UniqueColID = DBFunctions.DBFunctions.testExist(id);
            MergeDocument doc;
            if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false)
            {
               doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID);
            }
            else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true)
            {
                doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID);
            }
            DBFunctions.DBFunctions.FlagDriverPrintOnly = false;
                if (doc == null)
                doc = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");

            doc.DrawToWeb();
        }
    }
    catch(Exception err)
    {
        MessageBox("Creating PDF file was not successful. " + err.ToString());
    }
于 2012-06-19T13:29:09.480 に答える
1

実際に使用する直前に変数を定義しdocます。

MergeDocument doc = null;
if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false) 
{ 
    doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID); 
} 
else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true) 
{ 
    doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID); 
} 
DBFunctions.DBFunctions.FlagDriverPrintOnly = false; 
if (doc == null)
于 2012-06-19T13:29:30.570 に答える
1

doc宣言と代入を分離し、宣言を適切なスコープに入れます。

MergeDocument doc = null;

if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false)
{
    doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID);
}
else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true)
{
    doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID);
}

// Use the `doc` below as appropriate...
于 2012-06-19T13:30:19.260 に答える
1

コードをリファクタリングします。

オブジェクトの作成を新しいメソッドに抽出します。これにより、プログラムの流れがより明確になります。

初期化されていないか、デフォルト値を保持するだけの変数は良くありません。コンパイラは、割り当てられていない変数の誤用を検出できません (デフォルト値が null になっているため)。

基本的:

var doc = GetMergeDocument(id, type, FilePath, UniqueColID)
if (doc == null)
    doc = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");

doc.DrawToWeb();

このようにして、GetMergeDocumentnull が返された場合はそれに応じて処理することもわかります。

于 2012-06-19T13:33:36.027 に答える
0

解決策はかなり単純です。あなたが c# の初心者だと仮定します。doc変数をより広いスコープに移動するだけです:

MergeDocument doc = null;
if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false)
{
    doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID);
}
else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true)
{
    doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID);
}
于 2012-06-19T13:28:11.600 に答える
0

if に入る前に宣言してください。

宣言は次の行です。

 MergeDocument doc;

次に、必要な場所に割り当てます

doc = PDF ...
于 2012-06-19T13:28:39.243 に答える
0

この変数の宣言をdoc関数の先頭に移動します

protected void Page_Load(object sender, EventArgs e) 
    { 
        MergeDocument doc // Move the declaration here..
        try 
        { 
            string id, type, UniqueColID; 
            string FilePath = Server.MapPath("~").ToString(); 
            type = Request.QueryString["type"]; 

            if (type.Equals("template")) 
            { 
                MergeDocument template = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf"); 
                template.DrawToWeb(); 
            } 
            else 
            { 
                id = Request.QueryString["id"]; 
                UniqueColID = DBFunctions.DBFunctions.testExist(id); 
                if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false) 
                { 
                    doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID); 
                } 
                else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true) 
                { 
                    doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID); 
                } 
                DBFunctions.DBFunctions.FlagDriverPrintOnly = false; 
                    if (doc == null) 
                    doc = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf"); 

                doc.DrawToWeb(); 
            } 
        } 
        catch(Exception err) 
        { 
            MessageBox("Creating PDF file was not successful. " + err.ToString()); 
        } 
于 2012-06-19T13:30:08.103 に答える
-1

ステートメント外で使用するには、ステートメントMergeDocumenttryまたはステートメント内で定義する必要があります。elseif...else if

protected void Page_Load(object sender, EventArgs e)
    {
                    MergeDocument doc = null;
        try
        {
            string id, type, UniqueColID;
            string FilePath = Server.MapPath("~").ToString();
            type = Request.QueryString["type"];

            if (type.Equals("template"))
            {
                MergeDocument template = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");
                template.DrawToWeb();
            }
            else
            {
                id = Request.QueryString["id"];
                UniqueColID = DBFunctions.DBFunctions.testExist(id);
                if (DBFunctions.DBFunctions.FlagDriverPrintOnly == false)
                {
                    doc = PDF.LongFormManipulation.generatePDF(id, type, FilePath, UniqueColID);
                }
                else if (DBFunctions.DBFunctions.FlagDriverPrintOnly == true)
                {
                    doc = PDF.LongFormManipulation.generatePDFDriverOnly(id, type, FilePath, UniqueColID);
                }
                DBFunctions.DBFunctions.FlagDriverPrintOnly = false;
                    if (doc == null)
                    doc = new MergeDocument(FilePath + @"\Template\MVCTemplate.pdf");

                doc.DrawToWeb();
            }
        }
        catch(Exception err)
        {
            MessageBox("Creating PDF file was not successful. " + err.ToString());
        }
于 2012-06-19T13:33:42.567 に答える