由于保护级别,Addrange无法访问?

时间:2015-01-18 15:32:23

标签: c# protection

在某处cb.Items.AddRange(数据库)由于保护级别而无法访问,但所有变量都设置为公共。 这里说:

  

C:\ Users \ Shulz \ Documents \ MySql \ Oliver exer3 \ showdb.cs(77,18):错误   CS0122:`系统   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;
    }
}

2 个答案:

答案 0 :(得分:1)

List<string>不是object[],因此它与AddRange不兼容,并且您收到编译错误。

在.net上,此错误是:

  

'System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])'的最佳重载方法匹配有一些无效的参数

     

参数1:无法从'System.Collections.Generic.List<string>'转换为'object[]'

Mono似乎有另一个内部重载需要IList。如果可以访问此重载,则它与您的呼叫匹配。所以建议的错误原因有点不同。

通常,编译器会首先注意到没有匹配的重载。为了帮助你,它试图猜测可能的原因。这种猜测可能会受到内部方法的影响。

答案 1 :(得分:0)

我已经想出如何解决这个问题。所以我做的是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);