2012-02-25 2 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

В этом случае укажите свой фактический код. –

+0

В коде вы создаете два экземпляра класса Form1, но только один из них показан или активирован. Что вызывает OnMessage и почему это статический метод? Вы должны попытаться поместить его как нестатический метод в свой класс Form1. Из класса Form1 вы должны иметь доступ к listPlayers напрямую. –

ответ

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 должен быть публичным)

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

В качестве альтернативы, можно подвергать список игроков как статическое свойство в Form1

public partial class Form1 : Form 
{ 
    public static CheckedListBox PlayerList { get; private set; } 

    public Form1() 
    { 
     InitializeComponent(); 
     PlayerList = listPlayers; 
    } 

    ... 
} 

Теперь вы можете получить доступ к нему, как

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

Хорошо, спасибо. Теперь ошибка защиты ... –

+0

Ну 'listPlayers' объявлен как закрытый.В окне свойств вы можете установить свойство 'Модификаторы' (найдено в категории' Дизайн') 'listPlayers'' Public'. 'private' члены видны только внутри класса. См. [Модификаторы доступа (Руководство по программированию на C#)] (http://msdn.microsoft.com/en-us/library/ms173121.aspx) в MSDN. –

 Смежные вопросы

  • Нет связанных вопросов^_^