0

メインフォームでリストボックスを選択方法として使用するc#のプログラムに取り組んでいます。リストボックス内の項目を編集できる機能があります。

別の専用フォームからアイテムを編集したかったので、フォームの新しいインスタンスを作成しましたが、元のフォームの関数 (公開したもの) にアクセスしようとすると、次のエラーが発生します: エラー 2 オブジェクト参照が必要です非静的フィールド、メソッド、またはプロパティ

私はインターネット上でかなり見回しましたが、関数で静的プロパティを使用することについて話している人しかいません。ただし、これを行うと、関数内の変数などで上記のエラーがさらにポップアップ表示されます

Form1の関数は次のとおりです(これを参照しようとしています)

public void ReadConfig(string configFile)
    {
        fileList.Clear();
        listBoxName.Items.Clear();
        FileStream file = null;

        if (!File.Exists(file))
        {
            MessageBox.Show(file + " was not found: Creating blank file");
            using (file = File.Create(file)) ;
        }
        else
        {
            string line;
            int lineNumber = 1;

            // I cut out some long code here where the program reads from a file and saves it to an object
        }
    }

エラーが発生した場所のコード スニペットを次に示します (テキスト ファイルに保存するコードをいくつか切り取りましたが、懸念される主な部分は Form1.ReadFile(Form1.file)

        private void buttonSave_Click(object sender, EventArgs e)
    {
        string[] temp = File.ReadAllLines(Form1.file);
        string[] newFile;

        if (itemNew == true)
        {
            newFile = new string[temp.Length + 1];
        }
        else
        {
            newFile = new string[temp.Length];
        }

        for (int i = 0; i < temp.Length; i++)
        {
            newFile[i] = temp[i];
        }
        File.WriteAllLines(Form1.file, newFile);
        ConfigForm.ReadFile(Form1.file);


        this.Close();
    }

これで十分なコードになることを願っています。私のプログラムはかなり長いので、できるだけ短く直接的にしようとしました。我慢してくれてありがとう =]

私はプログラミングに関してかなりの初心者なので、親切な魂がたまたま助けてくれたら、できるだけシンプルに保つことができますか?

どうもありがとう =]

4

3 に答える 3

1

おそらく、最初のウィンドウに存在する関数を2番目のウィンドウから静的であるかのように使用しようとしているが、そうではないためです。

この問題を次の方法で解決できます。

  • 2 番目のフォームでは、次のように、最初のフォームのクラスでプロパティを作成します。

    class Form1 : Form
    {
        //this property will store reference to the first form
        public Form1 AssociatedFirstForm { get; set; }
        //...
    }
    
  • 次に、2 番目のフォームを作成するコードで、最初のフォームをこのプロパティに割り当てます。これは次のようになります (最初のフォームから 2 番目のフォームを作成する場合)。

    ...
    Form2 secondForm = new Form2();
    secondForm.AssociatedFirstForm = this;
    ...
    

または次のように (コードの別の部分から両方のフォームを作成する場合):

    ...
    Form1 firstForm = new Form1();
    Form2 secondForm = new Form2();
    secondForm.AssociatedFirstForm = firstForm;
    ...
  • 次に、2 番目のフォームでは、次のように最初のフォームからメソッドを呼び出すことができるはずです。

    ...
    var myResultFromAnotherWindow = this.AssociatedFirstForm.SampleMethodToCall();
    ...
    

静的クラスとクラス メンバーの使用、およびオブジェクトのインスタンスの作成についても読む必要があると思います。それらをいつ、どのように使用するかを明確にする必要があります。

アップデート

私はそれを十分に明確に書いていませんが、本当に必要でない場合は、expose メソッドまたはプロパティを public として設定することは避けるべきです。

アプリケーションで適切なコード構造を作成し、その方法を学びたい場合は、オブジェクト指向プログラミングに関する記事を探してください。

いくつかのサンプル リンク:

イベント メカニズムを知っていることも役立ちます: http://msdn.microsoft.com/en-us/library/awbftdfh.aspx

于 2012-04-23T19:18:06.927 に答える
0

タイプのインスタンスではなく、タイプでメソッドを呼び出しています。メソッドが静的として宣言されていない場合は、最初にそれらのメソッドを含むオブジェクトを(newを使用して)インスタンス化する必要があります。

于 2012-04-23T19:09:35.213 に答える
0

これが、達成しようとしていることの基本的な考え方です。それを行うためのより高度な方法は、デリゲート/イベント ハンドラーを使用することですが、今のところシンプルに保ちたいと考えています。

フォーム1

 public Form1()
    {
        InitializeComponent();
    }

    List<string> _items = new List<string>();

    public void LoadListBoxWithItems()
    {
        for (int i = 0; i < 5; i++)
        {
            _items.Add(string.Format("My New Item {0}", i));
        }
        lbItems.DataSource = _items;
        lbItems.Refresh();
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
            Form2 form2 = new Form2();
            form2.LoadValues(lbItems.SelectedItem.ToString(), this);
            form2.ShowDialog();
    }

    public string GetCurrentItem()
    {
        return lbItems.SelectedItem.ToString();
    }

    public void UpdateItem(string item, string newitem)
    {
        int index = _items.IndexOf(item);
        _items[index] = newitem;
        lbItems.Refresh();
    }

フォーム2

  public Form2()
    {
        InitializeComponent();
    }

    private string _originalvalue = null;
    private Form1 _form1;

    public void LoadValues(string item, Form1 form)
    {
        _originalvalue = item;
        _form1 = form;
    }


    private void btnSave_Click(object sender, EventArgs e)
    {
        // Do work to change value
        string newvalue = _originalvalue;
        _form1.UpdateItem(newvalue, _originalvalue);
    }
于 2012-04-23T20:17:58.383 に答える