我有这个Checked List Box,listPlayers
。我想在被问到时添加(或删除)名称。这些名称自然是string
输入。
以下是相关代码:
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"
..好吧,我的错误处理技巧不是最好的。就像我说的,一切都是public
。
如果我使用完全错误的行为,请不要犹豫,向我展示正确的行为。
答案 0 :(得分: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"
。