【问题标题】:c# Calling method in partial call from another classc#在另一个类的部分调用中调用方法
【发布时间】:2017-08-15 16:32:06
【问题描述】:

我正在制作 c# 应用程序,我需要从另一个类访问部分类中的方法。

更具体地说,我想从与部分类不同但在同一命名空间中的类中添加项目到列表视图。

我试过这样:

    public partial class Aa : Form
{
    public static void UpdateListView(string[] array)
    {
        if (ProcessNetUsageList.InvokeRequired)
        {
            ProcessNetUsageList.Invoke(new Action<string[]>(UpdateListView), array);
        }
        else
        {
            ListViewItem item = new ListViewItem(array[0]);
            for (int i = 1; i < 4; i++)
                item.SubItems.Add(array[i]);
            ProcessNetUsageList.Items.Add(item);
        }
    }
}

然后从另一个类访问它,例如:

class Test
{
    test()
    {
        ProgramName.Aa.UpdateListView(someArray);
    }
}

但它给出了一个错误,因为静态方法只能访问静态变量,而我的列表视图不是静态的(我在 vs 设计器中创建了该列表视图)。

如果我从部分类中的方法中删除静态关键字,则我无法访问它。我尝试创建部分类的实例但没有成功。欢迎任何想法

注意:我在我的 UpdateListView 方法中使用 Invoke,因为稍后它将在新线程上运行

【问题讨论】:

  • "I tried to create instance of partial class but without success." - 好吧,你尝试了什么?因为要访问对象的实例,您确实需要该对象的实例。那么你的表单实例在哪里呢?

标签: c# listview partial-classes


【解决方案1】:

面向对象语言的本质是对象没有修改其他对象的通用访问权限。这是一件好事

您提供的代码相对较少,因此很难在这里提供完美的答案,但有一些范例可以解决此问题。

一种是将实例传递给您的测试类,如下所示:

class Test
{
    test(ProgramName.Aa form)
    {
        form.UpdateListView(someArray);
    }
}

或者,如果test 类实际上包含ListView,您可以将其传递给Aa 中的静态方法。

class Test
{
    ListView someListView;
    test()
    {
        ProgramName.Aa.UpdateListView(someListView, someArray);
    }
}

最终,您应该考虑这些对象之间的逻辑关系以确定这些对象应该如何通信。

【讨论】:

    【解决方案2】:

    像之前所做的那样,从 UpdateListView 中删除 static 关键字。在test()中,你需要在访问UpdateListView之前实例化Aa。

    Aa temp = new Aa()
    

    然后您可以使用

    访问该方法
    temp.UpdateListView(someArray);
    

    【讨论】:

    • 我也尝试过,但它给了我“嵌入语句可以是声明或标记语句”
    • 您的回答具有误导性,因为简单地创建Aa 类型的新对象将导致空对象。这将与示例中的不同。使用它自己的(可能是空的)ListView
    猜你喜欢
    • 2019-08-11
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多