gpt4 book ai didi

c# - 指定的 Visual 已经是另一个 Visual 的子项或组件目标的根

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:00 26 4
gpt4 key购买 nike

大家好,我一直在使用 WPF C# 搜索报告,找到了一份不错的报告,而且也很容易,找到了这个 link并使用它。所以我尝试使用它,请检查我的代码,

在我的 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。我将在模板文件夹中复制或编辑开源示例中的内容。我创建了名为 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 而没有错误,但是当我尝试关闭报告或再次单击该按钮时,它会给出一条消息,

Specified Visual is already a child of another Visual or the root of the component target

这是错误的图片,

enter image description here

我认为问题是当我调用打印按钮背后的代码的打印报告时,嗯,有人可以吗?请... :)

第二次编辑

关于您的问题:

  • 您说报告窗口通常会在没有错误的情况下打开第一次,但之后就没有了?

是的正确..

  • 是否有正在使用的任何共享资源ReportViolationWindow?

抱歉,我不知道,因为我只是按照开源中的示例进行操作。

  • 您如何处置/处理ReportViolationWindow?

到目前为止,我仍然没有正确关闭 ReportViolationWindow 的代码。当我点击关闭按钮时,就这样了,很抱歉。 :(

  • 您是否保留对此 ReportViolationWindow 的任何其他引用实例?

没有。据我所知。

最佳答案

在将视觉对象添加到新的父对象之前,您必须先将其从当前父对象“分离”出来 - 这样做的原因主要是渲染和合成引擎的工作方式;如果原始父元素不知道它不再负责呈现该子元素,并且 WPF 允许您将它附加到另一个父元素,那么在最好的情况下,您会呈现重复的 Visuals,而在最坏的情况下在这种情况下,您可能会陷入无限循环!

由于父元素负责添加/删除子元素,因此您需要在父元素级别处理此问题,通常调用 RemoveLogicalChildRemoveVisualChild (或者理想情况下,从原始 ItemsSource 中删除项目本身并将其添加到新项目中)

编辑:从技术上讲,第一段是正确的,但我认为第二段不适用于您...在查看了位于 WpfReports on CodePlexReportPaginator 类的源代码之后,我注意到以下内容:

  • 最新版本与您的不同,我相信:# 行不太匹配。可能这是一个已修复的错误?
  • (吹毛求疵)我不喜欢这段代码的结构(即报告引擎)...ArrayLists?单行 if/else/return 语句?

现在,针对您的实际问题:

  • 您说报告窗口通常第一次打开时不会出错,但之后就不会了?

  • ReportViolationWindow 中是否正在使用任何共享资源?

  • 您如何处置/处理 ReportViolationWindow 的关闭?

  • 您是否保留了对该 ReportViolationWindow 实例的任何 其他引用?

我想尝试的一件事是在创建它的窗口中声明类型为 NewReportViolationWindow 的单个成员变量 (EmployeeProfileWindow ), 而不是这个:

private void btnprintviolation_Click(object sender, RoutedEventArgs e)
{
ReportViolationWindow NewReportViolationWindow = new ReportViolationWindow();

尝试这样的事情:

ReportViolationWindow _reportViolationWindow;
private void btnprintviolation_Click(object sender, RoutedEventArgs e)
{
if(_reportViolationWindow != null)
{
_reportViolationWindow.Close();
_reportViolationWindow = null;
}
_reportViolationWindow = new ReportViolationWindow();

关于c# - 指定的 Visual 已经是另一个 Visual 的子项或组件目标的根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13426227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com