繁体   English   中英

由于保护级别而无法访问?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM