2

こんにちは皆さん、私は WPF C# を使用してレポートを探して作業しており、素敵なレポートの 1 つを見つけました。また、このリンクを見つけて使用してください。だから私はそれを使用しようとしました、plsは私のコードをチェックしてください、

EmployeeProfileWindowの印刷中ボタンで、

private void btnprintviolation_Click(object sender, RoutedEventArgs e)
{
    ReportViolationWindow NewReportViolationWindow = new ReportViolationWindow();
    //Windows.Add(NewReportViolationWindow);
    GlobalVar.ViolationEmpNum = txtdispid.Text;
    GlobalVar.ViolationRefNumToPrint.Clear();
    for (int i = 0; i < lvviolations.Items.Count; i++)
    {
        GlobalVar.ViolationRefNumToPrint.Add(((EmpViolationObject)lvviolations.Items[i]).VioRefNum);
    }
    NewReportViolationWindow.Show();
}

したがって、ボタンをクリックすると、新しいウィンドウ名が表示されますNewReportViolationWindow。オープンソースのサンプルと同じように、Template フォルダーにコピーまたは編集します。という名前のレポートを作成しましたReportViolation

これが のコード ビハインドですNewReportViolationWindow

ReportDocument reportDocument = new ReportDocument();
string ats = new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName;
StreamReader reader = new StreamReader(new FileStream(ats.ToString() + @"\Template\ReportViolation.xaml", FileMode.Open, FileAccess.Read));
reportDocument.XamlData = reader.ReadToEnd();
reportDocument.XamlImagePath = Path.Combine(ats.ToString(), @"Template\");
reader.Close();


DateTime dateTimeStart = DateTime.Now; // start time measure here
List<ReportData> listData = new List<ReportData>();
//foreach (string item in GlobalVar.ViolationRefNumToPrint)
for (int i = 0; i < 5 ; i++)
{
    ReportData data = new ReportData();

    data.ReportDocumentValues.Add("PrintDate", DateTime.Now);
    data.ReportDocumentValues.Add("EmpIDNum", NewIDNumber.ToString());
    data.ReportDocumentValues.Add("EmpName", NewEmpName.ToString());
    data.ReportDocumentValues.Add("EmpPosition", NewPosition.ToString());

    //data.ReportDocumentValues.Add("VioRefCode", item.ToString());
    listData.Add(data);
}

XpsDocument xps = reportDocument.CreateXpsDocument(listData);
documentViewer.Document = xps.GetFixedDocumentSequence();

// show the elapsed time in window title
Title += " - generated in " + (DateTime.Now - dateTimeStart).TotalMilliseconds + "ms";

}
catch (Exception ex)
{
    // show exception
    MessageBox.Show(ex.Message + "\r\n\r\n" + ex.GetType() + "\r\n" + ex.StackTrace, ex.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Stop);
}

アプリケーションを実行して印刷ボタンをクリックすると、最初はエラーなしで開くこともありNewReportViolationWindowますが、レポートを閉じるか、ボタンをもう一度クリックしようとすると、メッセージが表示されます。

指定されたビジュアルは、すでに別のビジュアルの子であるか、コンポーネント ターゲットのルートです

これがエラーの画像です。

ここに画像の説明を入力

問題は、印刷ボタンの背後にあるコードである印刷レポートを呼び出すときだと思います。うーん、誰でもできますか? お願いします... :)

2回目の編集

あなたの質問について:

  • レポート ウィンドウは通常、最初はエラーなく開きますが、その後は開かないとおっしゃっていますか?

はい正解..

  • で使用されている共有リソースはあり ReportViolationWindowますか?

申し訳ありませんが、私が何をしたかは、オープンソースのサンプルに従っているだけなので、わかりません。

  • のクローズをどのように処分/処理してい ReportViolationWindowますか?

これまでのところ、適切に閉じるためのコードがまだありませんReportViolationWindow。閉じるボタンをクリックすると、それで終わりです。申し訳ありません。:(

  • ReportViolationWindow このインスタンスへの他の参照を保持していますか?

いいえ、私が知る限り。

4

2 に答える 2