CS0120: An object reference is required for the nonstatic field, method, or property 'foo'

前端 未结 7 1006
挽巷
挽巷 2020-11-21 04:34

Consider:

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            


        
相关标签:
7条回答
  • 2020-11-21 05:08

    Credit to @COOLGAMETUBE for tipping me off to what ended up working for me. His idea was good but I had a problem when Application.SetCompatibleTextRenderingDefault was called after the form was already created. So with a little change, this is working for me:

    
    static class Program
    {
        public static Form1 form1; // = new Form1(); // Place this var out of the constructor

    /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(form1 = new Form1()); } }
    0 讨论(0)
  • 2020-11-21 05:13

    It looks like you are calling a non static member (a property or method, specifically setTextboxText) from a static method (specifically SumData). You will need to either:

    1. Make the called member static also:

      static void setTextboxText(int result)
      {
          // Write static logic for setTextboxText.  
          // This may require a static singleton instance of Form1.
      }
      
    2. Create an instance of Form1 within the calling method:

      private static void SumData(object state)
      {
          int result = 0;
          //int[] icount = (int[])state;
          int icount = (int)state;
      
          for (int i = icount; i > 0; i--)
          {
              result += i;
              System.Threading.Thread.Sleep(1000);
          }
          Form1 frm1 = new Form1();
          frm1.setTextboxText(result);
      }
      

      Passing in an instance of Form1 would be an option also.

    3. Make the calling method a non-static instance method (of Form1):

      private void SumData(object state)
      {
          int result = 0;
          //int[] icount = (int[])state;
          int icount = (int)state;
      
          for (int i = icount; i > 0; i--)
          {
              result += i;
              System.Threading.Thread.Sleep(1000);
          }
          setTextboxText(result);
      }
      

    More info about this error can be found on MSDN.

    0 讨论(0)
  • 2020-11-21 05:19

    For this case, where you want to get a Control of a Form and are receiving this error, then I have a little bypass for you.

    Go to your Program.cs and change

    Application.Run(new Form1());
    

    to

    public static Form1 form1 = new Form1(); // Place this var out of the constructor
    Application.Run(form1);
    

    Now you can access a control with

    Program.form1.<Your control>
    

    Also: Don't forget to set your Control-Access-Level to Public.

    And yes I know, this answer does not fit to the question caller, but it fits to googlers who have this specific issue with controls.

    0 讨论(0)
  • 2020-11-21 05:20

    You start a thread which runs the static method SumData. However, SumData calls SetTextboxText which isn't static. Thus you need an instance of your form to call SetTextboxText.

    0 讨论(0)
  • 2020-11-21 05:23

    Your method must be static

    static void setTextboxText(int result)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); 
        }
        else
        {
            SetTextboxTextSafe(result);
        }
    }
    
    0 讨论(0)
  • 2020-11-21 05:27

    From my looking you give a null value to a textbox and return in a ToString() as it is a static method. You can replace it with Convert.ToString() that can enable null value.

    0 讨论(0)
提交回复
热议问题