【问题标题】:Calling object from mainform.cs in other forms?以其他形式从 mainform.cs 调用对象?
【发布时间】:2014-09-12 20:22:47
【问题描述】:

我想从 GraficDisplay(命名空间)调用 mainform (mainform.cs) 中的任何内容 在另一个(命名空间):GraphLib,但我不能,有人能告诉我为什么吗?我该如何解决这个问题?自项目开始以来一直给我带来困难,每次我尝试这些错误都会出现:

当我打电话时:

mainform.toolstriplabel1.text = "87";

这会出现:

当前上下文中不存在名称“mainform”

如果我这样称呼:

GraficDisplay.MainForm.toolstriplabel1.text = "87";

这会出现:

当前上下文中不存在名称“GraficDisplay”

我的意思是我什至不能在 GraphLib(命名空间)中调用 GraficDisplay(命名空间) MainForm 也是 publicpartial

【问题讨论】:

  • 这两个命名空间是在不同的程序集中吗?如果有,您是否将它们添加为参考?
  • 我假设mainform 不是您尝试调用它的任何属性.. 为什么您需要这样做?您正在向调试痛苦的世界敞开大门。并且命名空间在内存中没有空间(Afaik 在编译中“丢失”了?)
  • 好吧,不要嘲笑我,但我还没有学到这么多,而且我已经得到了这个项目要做,它是预先编写好的,我只是在为某人调整它,因为没有每个人都知道 C#,我必须这样做,这是解决方案的标题:Solution 'GraficDisplay (2Projects)'
  • 好吧 MainForm 是一个类,我必须,有一个文本框,当它的文本改变时,图形标题应该改变,这是 GraphLib(命名空间)中的另一种形式,所以我必须从 GraphLib 中的 MainForm 调用工具条标签和 display.DataSources[].Name 或从 MainForm 中的 GraphLib 调用 textchange 属性,我不能'两者都做
  • @nvoigt 因为它是预先编写的,我不知道,我应该如何解决它?这是程序的链接:codeproject.com/KB/miscctrl/GraphPlotting/…

标签: c# winforms namespaces


【解决方案1】:

我通常也不关注这里的链接,但 CodeProject 是一个相当可靠的来源 imo,所以我看了一下。

编辑:我对你想要什么感到困惑。以下是你似乎真正想要的:

问题在于从另一个表单或其中的一部分引用表单或其中的一部分。这是处理库的进一步问题,添加示例应用程序的命名空间或依赖项等确实不应该搞砸。

所以你想要的是松散耦合

这是一个使用库对象中的引用并注册方法来填充引用的解决方案。如果您不注册任何内容,该库将正常工作。

此解决方案可以更改和扩展,但我将把它留给注册两个对象:一个是控件,例如 TextBox;另一个是组件,例如一个 ToolStripItem。如果您只想引用 ToolStripItem,您可以省略对 Control 和 RegisterCtl 方法的引用。

在这种情况下,您可以也应该用“Component”代替“ToolStripItem”以使事情变得更加紧凑!

首先,您将转到操作的最终消费者PlotterGraphSelectCurvesForm。在这里添加这两个代码块:

public partial class PlotterGraphSelectCurvesForm : Form
{
    private int selectetGraphIndex = -1;
    private PlotterGraphPaneEx gpane = null;

    // block one: a Control reference (if you like!):
    Control myTextCtl;
    public void RegisterCtl(Control ctl) { if (ctl != null) myTextCtl = ctl; }

    // block one: a Component reference:
    Component myTextComp;
    public void RegisterComp(Component comp) { if (comp != null)  myTextComp = comp; }  
    //..

接下来你编写你想要发生的事情,可能是这样的:

    void tb_GraphName_TextChanged(object sender, EventArgs e)
    {
        if (selectetGraphIndex >= 0 && selectetGraphIndex < gpane.Sources.Count)
        {
            DataSource src = gpane.Sources[selectetGraphIndex];
            String Text = tb_GraphName.Text;

            // all controls have a Text:
            if (myTextCtl != null) myTextCtl.Text = Text;
            // here you need to know the type:
            if (myTextComp != null) ((ToolStripItem) myTextComp).Text = Text;
            //..   

        }

理论上,您现在需要做的就是在 Mainform 中注册 TextBox 和/或 ToolStripItem。但是,有一个复杂的问题:PlotterGraphSelectCurvesForm 不是从 Mainform 调用的!相反,它是从 UserObject PlotterGraphPaneEx 调用的,而 UserObject PlotterGraphPaneEx 又位于 MainForm 中。本着不通过创建依赖项来搞乱库的精神,您只需向此 UO 添加完全相同的引用和注册方法:

public partial class PlotterDisplayEx : UserControl
{         
    #region MEMBERS

    Control myTextCtl;
    public void RegisterCtl(Control ctl) { if (ctl != null) myTextCtl = ctl; }

    Component myTextComp;
    public void RegisterComp(Component comp) { if (comp != null) myTextComp = comp; } 
    //..

现在您可以在 MainForm 中实际注册东西了..:

    public MainForm()
    {           
        InitializeComponent();

        display.RegisterCtl(aDemoTextBox);
        display.RegisterComp(toolstriplabel1);
        //..

..在 UO 中:

    private void selectGraphsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (GraphPropertiesForm == null)
        {
            GraphPropertiesForm = new PlotterGraphSelectCurvesForm();
            GraphPropertiesForm.RegisterCtl(myTextCtl);
            GraphPropertiesForm.RegisterComp(myTextComp);
        }
    //..

现在,当您打开 Properties 表单并更改 LabelText 时,您可以看到 Graphs 中的文本以及 Menu 和 TextBox 中的文本都发生了变化..

【讨论】:

  • 谢谢,是的,我创建了工具条标签1,它不存在,如果你仔细观察,在 GraphLib 命名空间中有一个名为“PlotterGraphPropertiesForm.cs”的表单,在设计器视图中你会看到文本框命名:“tb_GraphName”程序会在此文本框的文本更改时自动更新图形名称,现在我想添加从 MainForm(来自 GraficDisplay 命名空间)自动更改 toolstriplabel1.text 的功能,有什么办法吗?由于该程序不允许我将 GraphLib 的引用添加到 GraficDisplay ,所以我使用了 interface ,但它也
  • 失败,因为这些未定义为重载 tb_GraphName.TextChanged += new EventHandler(tb_GraphName_TextChanged); public void tb_GraphName_TextChanged(object sender, EventArgs e) 到这个 public void tb_GraphName_TextChanged(object sender, EventArgs e, Access.Access ac) ...(access 是我创建的一个命名空间,其中有一个名为 access 的接口)
  • 但另一方面,我试图找到代码定义了这些图形名称的放置位置?我尝试了布局部分,但找不到,我想将堆叠模式名称更改为在左侧垂直显示,这是定义名称的代码:display.DataSources[j].Name = "Graph" + ( j + 1); line567 column66 character66
  • 好的,让我们直截了当。您已在主菜单中添加了一个工具条并想从哪里引用它?从 PlotterGraphSelectCurvesForm 弹出窗口?对吗?
  • 是的,非常感谢,很高兴看到有人真正关心编程,而其他人只是对问题进行评分,我希望这可行,做得好,再次感谢
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多