[英]Addrange Inaccessible due to protection level?
由于保护级别的缘故,在cb.Items.AddRange(databases)的某个位置无法访问,但是所有变量都设置为public。 它说:
C:\\ Users \\ Shulz \\ Documents \\ MySql \\ Oliver exer3 \\ showdb.cs(77,18):错误CS0122:由于无法访问Sys tem.Windows.Forms.ComboBox.ObjectCollection.AddRange(System.Collections.IList)'到其保护级别C:\\ PROGRA〜2 \\ MONO-3〜1.3 \\ lib \\ mono \\ 4.5 \\ System.Windows.Forms.dll(与先前错误相关的sy mbol的位置)编译失败:1个错误, 0警告
public ComboBox cb;
public Label label;
public object[] databases;
public MForm() {
string connectionString =
"Server=localhost;" +
"Database=information_schema;" +
"User ID=root;" +
"Password=root;" +
"Pooling=false";
IDbConnection dbcon;
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
IDbCommand dbcmd = dbcon.CreateCommand();
string sql = "SELECT COUNT(*) as count FROM information_schema.SCHEMATA"; //count the databases(string) and names it count
dbcmd.CommandText = sql; //sends the string to sql
IDataReader reader = dbcmd.ExecuteReader(); //assign the function to reader
reader.Read(); //uses its getter(Read)
int count = Convert.ToInt32(reader["count"]); //converts the "count"(column) to integer
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
dbcmd = dbcon.CreateCommand();
sql = "show databases";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
var databases = new List<string>();
var excludeDatabases = new List<string> { "information_schema","sakila","enrollmentsystem","mysql","world","performance_schema" };
while(reader.Read())
{
var data = reader["Database"].ToString();
if(!excludeDatabases.Contains(data)){
databases.Add(data);
}
}
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
Text = "School Year";
Size = new Size(340, 240);
cb = new ComboBox();
cb.Parent = this;
cb.Location = new Point(50, 30);
cb.Items.AddRange(databases);
cb.SelectionChangeCommitted += new EventHandler(OnChanged);
label = new Label();
label.Location = new Point(80, 170);
label.Parent = this;
label.Text = "...";
CenterToScreen();
}
void OnChanged(object sender, EventArgs e) {
ComboBox combo = (ComboBox) sender;
label.Text = combo.Text;
}
}
List<string>
不是object[]
,因此它与AddRange
不兼容,并且会出现编译器错误。
在.net上,此错误是:
'System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])'
的最佳重载方法匹配具有一些无效的参数参数1:无法从
'System.Collections.Generic.List<string>'
转换为'object[]'
Mono似乎还有另一个内部重载采用IList
。 如果可以访问此重载,那么它将与您的呼叫匹配。 因此,建议的错误原因有些不同。
通常,编译器首先会注意到没有匹配的重载。 为了帮助您,它会尝试猜测可能的原因。 这种猜测可能会受到内部方法的影响。
我已经弄清楚了如何解决这个问题。 所以我要做的是db.ToArray()然后分配我的数据库对象。 就这么简单。
var db = new List<string>();
var excludeDatabases = new List<string> { "information_schema","sakila","enrollmentsystem","mysql","world","performance_schema" };
while(reader.Read())
{
var data = reader["Database"].ToString();
if(!excludeDatabases.Contains(data)){
db.Add(data);
}
}
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
Text = "School Year";
Size = new Size(340, 240);
cb = new ComboBox();
cb.Parent = this;
cb.Location = new Point(50, 30);
databases = db.ToArray();
cb.Items.AddRange(databases);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.