2016-03-16 4 views
1

OK Это то, что у меня есть. У меня есть моя основная форма frmMain.cs, и у меня есть class.cs. Я делал в RssFeed для моей электронной почты, и я получаю сообщение об ошибке:frmMain недоступен из-за его уровня защиты

inaccessible due to its protective level.

На моем class.cs У меня есть следующий код:

public class RSSFeed 
{ 
    public void CheckForEmails() 
    { 
     string GmailAtomUrl = "https://mail.google.com/mail/feed/atom"; 
     XmlUrlResolver xmlResolver = new XmlUrlResolver(); 
     xmlResolver.Credentials = new NetworkCredential(Settings.Default.GmailUser, Settings.Default.GmailPassword); 
     XmlTextReader xmlReader = new XmlTextReader(GmailAtomUrl); 
     xmlReader.XmlResolver = xmlResolver; 
     try 
     { 
      XNamespace ns = XNamespace.Get("http://purl.org/atom/ns#"); 
      XDocument xmlFeed = XDocument.Load(xmlReader); 

      var emailItems = from item in xmlFeed.Descendants(ns + "entry") 
       select new 
       { 
        Author = item.Element(ns + "author").Element(ns + "name").Value, 
        Title = item.Element(ns + "title").Value, 
        Link = item.Element(ns + "link").Attribute("href").Value, 
        Summary = item.Element(ns + "summary").Value 
       }; 

      frmMain.MsgList.Clear(); 
      frmMain.MsgLink.Clear(); 
      foreach (var item in emailItems) 
      { 
       if (item.Title == String.Empty) 
       { 
        frmMain.MsgList.Add("Message from " + item.Author + ", There is no subject and the summary reads, " + item.Summary); 
        frmMain.MsgLink.Add(item.Link); 
       } 
       else 
       { 
        frmMain.MsgList.Add("Message from " + item.Author + ", The subject is " + item.Title + " and the summary reads, " + item.Summary); 
        frmMain.MsgLink.Add(item.Link); 
       } 
      } 

      if (emailItems.Count() > 0) 
      { 
       if (emailItems.Count() == 1) 
       { 
        frmMain.lblEmail.Text = ("You have one new email, would you like me to read it to you"); 
       } 
       else 
       { 
        frmMain.lblEmail.Text("You have " + emailItems.Count() + "new emails"); 
       } 
      } 
      else if (frmMain.QEvent == "CheckForNewEmails" && emailItems.Count() == 0) 
      { 
       frmMain.lblEmail.Text("You have no new emails"); frmMain.QEvent = String.Empty; 
      } 
     } 
     catch 
     { 
      frmMain.lblEmail.Text("You have submitted invalid log in information"); 
     } 
    } 
} 

А потом у меня на моей главной форме клещ таймера событий:

public void tmrEmail_Tick(object sender, EventArgs e) 
{ 
    lblEmail.Text = ("New Emails " + RSSFeed.CheckForEmails); 
} 

То, что я не понимаю, - это когда у меня есть ярлык в RSSFeed или на моей основной таймере. Я получаю ошибку. Я изменил все на public, и он все еще бросает ошибку.

Я что-то упустил или у меня не было всего, что у меня было бы?

Также у меня будет другая форма, предназначенная только для электронной почты. Было бы лучше покончить с RSSFeed.cs и просто закодировать winform? Единственное, что он делает, это создать ярлык, когда у меня появятся новые письма.

Любые мысли?

+0

Также он отлично работает в одной форме. Его просто ярлык не работает. – ivansystems

+0

Вы имеете в виду 'frmMain' как класс - когда вы должны использовать * объект * этого класса. – Rob

+0

это то, что я есть на общедоступном класса frmMain частичной frmMain – ivansystems

ответ

2

Вам не хватает ключевого слова static из вашего класса и метода. Должно быть public static class RSSFeed и public static void CheckForEmails()

Вам также необходимо передать экземпляр frmMain в метод. Например:

public static void CheckForEmails(frmMain frmMainInstance) 

Собираем все вместе:

public static class RSSFeed 
{ 
    public static void CheckForEmails(frmMain frmMainInstance) 
    { 
     string GmailAtomUrl = "https://mail.google.com/mail/feed/atom"; 
     XmlUrlResolver xmlResolver = new XmlUrlResolver(); 

     // ... rest of your code ... 
    } 
} 

И призыв к нему было бы что-то вроде:

public void tmrEmail_Tick(object sender, EventArgs e) 
{ 
    // The following line will produce a compile error because 
    // CheckForEmails doesn't return a value 
    // lblEmail.Text = ("New Emails " + RSSFeed.CheckForEmails(this); 
    // Try this instead: 
    RSSFeed.CheckForEmails(this); 
} 

Обратите внимание, что я предполагаю, что tmrEmail_Tick является метод frmMain , поэтому я прохожу this в качестве аргумента в CheckForEmails.

Вместо того, чтобы RSSFeed и CheckForEmails статический вы можете создать экземпляр экземпляр RSSFeed:

public void tmrEmail_Tick(object sender, EventArgs e) 
{ 
    RSSFeed feed = new RSSFeed(); 
    feed.CheckForEmails(this); 
} 

Обратите внимание, что вы по-прежнему необходимо пройти frmMain экземпляр в качестве аргумента CheckForEmails.

+0

Я никогда не делал RSS-канал на class.cs. Я всегда делал это в самой форме. Но я также буду делать около 10 различных каналов. – ivansystems

+0

Да, его таймер находится в frmMain. Я создаю программу цифрового помощника, и я сделал все это раньше на основе одной формы. Поскольку я нахожусь в отпуске на месяц, я переделываю приложение и делаю его несколькими формами. – ivansystems

+0

Хорошо, я понимаю, что вы делаете и что я сделал неправильно. Я дам вам попытку и вернусь к вам. Также он был первоначально frmMain.Ivan.SpeakAsync, поэтому, если я верну его обратно к оригиналу, это будет одно и то же, правильно? – ivansystems

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