2014-06-09 51 views
1

我有一个应用程序显示来自数据库的结果数据。偶尔如果结果带有附加数据,我们会追加记录。在这种情况发生之前,UserControl中的值为“NA”。我在UserControl类中有一个refreshdisplay()方法,它运行得很漂亮,不幸的是,如果我在使用“new”之后从我的dataHandler类调用它,那么UserControl不会刷新。我猜这是因为我用从外部类刷新userControl

UserControlResultDisplay resultDisplay = new UserControlResultDisplay(); 

如何使用的方法,并与现有的用户控件不实例化一个新的互动?

下面是一些代码片段:

UserControlResultDisplay resultDisplay = new UserControlResultDisplay(); 

public void UpdateResultDB(ResultDataJFTOT resultData) 
    { 


      AnalysisListCommon myresult = PContext.GetInstance().DbHandlerLocal.StoredResult(
       resultData.SampleId, 
       resultData.TestDate.ToString("yyyy-MM-ddTHH:mm", CultureInfo.InvariantCulture), 
       resultData.InstrumentSn, 
       StringRepository.constStringSampleName); 



      if (myresult != null) 
      { 
       Result r = new Result(new Guid(myresult.ResultId)); 

       ResultData rd = r.GetResultData("Rating", FindResultDataMode.byVariableIdentifier); 
       string xmlTubeRating = resultData.tRating.ToString().Replace("#LT#", "<"); 
       rd.Text = xmlRating; 
       rd.Store(); 

       rd = r.GetResultData("TestDate", FindResultDataMode.byVariableIdentifier); 
       rd.Text = resultData.Date.ToString(); 
       rd.Store(); 

       resultDisplay.RefreshDisplay(); 

       else 
      { 
       AddTestToQueue(resultData); 
      } 

      } 
+0

通过构造函数传递现有引用?多数民众赞成你通常这样做...我错过了什么可以防止呢? – BradleyDotNET

+0

我这样做了,但关键字“新”的使用似乎在我的giddyup中造成困难。这是否打开一个新的UserControl实例,而不是使用打开的实例。调用函数不在表单中,因此该函数在UserControl打开并可见时执行。我有点新手,所以请耐心等待,并详细说明我是否离开基地。 – willkk

+0

如果您将它作为参数传递,则不需要'new'关键字。你可以在这里发布代码吗? – BradleyDotNET

回答

1

正如你指出的,问题就出在声明中:

UserControlResultDisplay resultDisplay = new UserControlResultDisplay(); 

此实例化一个新的对象(没有联系到现有的一个),所以在其上运行函数绝对没有机会影响在GUI上显示的内容。

在我找到正确的代码之前,让我试着清理一下“对象”是什么。在C#中的每一个类型,无论是显式的还是隐式的,都可以被认为是一个“对象”(偶数值类型像int),因此区分在很大程度上是不相关的。你是正确的,但是,他说,有对象的两种分类:这是通过(不奇怪)的值,并且不需要/允许创建过程中new关键字

  1. 值类型。这些都是你intfloat,由参考过去了,确实使用了new关键字来创建它们char
  2. 引用类型。这些都是用class(可能还有其他几个,但这是一个很好的经验法则)声明的东西。

这两个参数对于任何函数都是完全可以接受的参数,它们只是以不同的方式传递。对于你想要做的事情,我们实际上利用了这一点。如果你写:

UserControlResultDisplay resultDisplay; 

public MyDataClass(UserControlResultDisplay uiDisplay) 
{ 
    resultDisplay = uiDisplay; 
} 

你得到(和存储)一参考现有UI对象。现在当你调用它的函数时,它会影响UI(假设当然UI边的所有内容都是正确设置的)。你会调用此构造这样的(假设它是从UI类):

MyDataClass data = new MyDataClass(this); 

如果你调用它在其他地方,你显然需要从其他地方到UI的引用传递给MyDataClass

+0

感谢您花时间向我展示这一点。 – willkk