2012-02-25 78 views
1

我有这个勾选列表框,listPlayers。我希望在问及时添加(或删除)名称。这些名字自然是在string输入。CheckedListBox编辑/添加

这里是有问题的代码:

namespace TakoBot 
{ 
    static class Program 
    { 
     public static Form1 MainForm { get; private set; } 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      MainForm = new Form1(); 
      Application.Run(new Form1()); 
     } 
     public static void OnMessage(object sender, PlayerIOClient.Message m) 
     { 
      if (m.Type == "add") 
      { 
       NamesInt[m.GetString(1)] = m.GetInt(0); 
       NamesString[m.GetInt(0)] = m.GetString(1); 
       Program.MainForm.listPlayers.Add("PlayersName"); 
      } 
     } 
    } 
} 

当打电话的动作Form1.listPlayers.Add("PlayersName");,我们得到如下错误:

"'MyProgram.Form1.listPlayers' is inaccessible due to its protection level" 

..Okay,我的错误处理技能是不是最好的。就像我说的,一切都是public

如果我使用完全错误的操作,请不要犹豫,告诉我正确的。

+0

在这种情况下发布您的实际代码。 – 2012-02-25 19:53:14

+0

在您的代码中,您正在创建Form1类的两个实例,但只有一个会显示或激活。什么叫OnMessage,为什么它是一个静态方法?您应该尝试将它作为一个非静态方法放在Form1类中。从您的Form1类中,您应该能够直接访问listPlayers。 – 2012-02-25 20:31:49

回答

1

Form1是一个类型,而不是一个实例。

在你Program做这样的事情

static class Program 
{ 
    public static Form1 MainForm { get; private set; } 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     MainForm = new Form1(); 
     Application.Run(MainForm); 
    } 
} 

现在,你可以参考这样的形式(listPlayers必须是public)

Program.MainForm.listPlayers.Add("PlayersName"); 

作为替代方案,你可以暴露播放列表作为静态属性Form1

现在

可以像

Form1.PlayerList.Add("PlayersName"); 

访问它,因为它是静态的,即PlayerList属于的类型(类)Form1,不要的Form1一个实例(对象)。这仅适用于您只有一个Form1实例随时打开的情况。


鉴于

class MyClass 
{ 
    public static string S; 
    public string I; 
} 

你可以做到这一点

MyClass a = new MyClass(); 
MyClass b = new MyClass(); 

a.I = "Hello"; 
MyClass.S = "One"; 

b.I = "World"; 
MyClass.S = "Two"; 

静态变量MyClass.S可以在给定的时间只有一个值。这段代码的末尾将是"Two"

实例变量I可以在每个实例中具有不同的值(a,b)。在此代码a.I的末尾将是"Hello"b.I将是"World"

+0

好的,谢谢。现在保护错误... – 2012-02-25 20:02:24

+0

那么'listPlayers'被声明为私有。在属性窗口中,您可以将'listPlayers'的'Modifiers'属性(在'Design'类中找到)设置为'Public'。 “私人”成员只能在课堂内部看到。请参阅MSDN上的[Access修饰符(C#编程指南)](http://msdn.microsoft.com/zh-cn/library/ms173121.aspx)。 – 2012-02-25 20:26:24