2016-11-14 4 views
-2

実行時にリストを作成して後で修正することには苦労しています。プログラムは、createlist()関数でListViewを作成し、別の関数で変更しようとしています。任意の助けいただければ幸い誰かが将来的にこの問題を回避する方法を私に言うことができる場合、私は好む:) コードを抽出します。別の関数で関数によって作成されたオブジェクトを変更する方法C#

public void createlist() 
     { 

      ListView MainList = new ListView(); 

      DisplayPanel.Controls.Add(MainList); 

      MainList.View = View.Details; 
      MainList.GridLines = true; 

      MainList.Name = "MainList"; 
      MainList.Size = DisplayPanel.Size; 
      int s1 = DisplayPanel.Size.Height; 
      int s2 = DisplayPanel.Size.Width; 
      MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top); 

      MainList.Columns.Add("ProductName", 100); 
      MainList.Columns.Add("ProductName2", 100); 
      MainList.Columns.Add("ProductName3", 100); 
      MainList.Columns.Add("ProductName4", 100); 

     } 

private void button1_Click(object sender, EventArgs e) 
     { 

      createlist(); //Calls function and creates the ListView 

      ListViewItem Source = new ListViewItem("Source", 0); 
      Source.Checked = true; 
      Source.SubItems.Add("7"); 
      Source.SubItems.Add("8"); 
      Source.SubItems.Add("9"); 

      MainList.Items.AddRange(new ListViewItem[] {Source}); 

     } 
エラー

: エラーCS0103名は「MainList」は、現在では存在しませんがあなたのcreateListのコンテキスト事前に

感謝:)

+0

'MainList'は' createlist'でしか有効ではないので、コンパイルエラーが発生しました。(BTW:コンパイルエラーは簡単に修正できますが、いくつかのC#ドキュメントを読んでください) –

+0

'DisplayPanel.Controls'クラスレベルのフィールドにすることができます。 –

+2

学ぶ必要がある概念は、[Scope](https://msdn.microsoft.com/en-us/library/ms973875.aspx)と呼ばれます。 – mason

答えて

0

これを別の機能からアクセスするには、クラスのメンバーにする必要があります。以下を参照してください:

class Foo{ 
    ListView MainList = new ListView(); 
    public void createlist() 
     { 

      MainList = new ListView(); 

      DisplayPanel.Controls.Add(MainList); 

      MainList.View = View.Details; 
      MainList.GridLines = true; 

      MainList.Name = "MainList"; 
      MainList.Size = DisplayPanel.Size; 
      int s1 = DisplayPanel.Size.Height; 
      int s2 = DisplayPanel.Size.Width; 
      MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top); 

      MainList.Columns.Add("ProductName", 100); 
      MainList.Columns.Add("ProductName2", 100); 
      MainList.Columns.Add("ProductName3", 100); 
      MainList.Columns.Add("ProductName4", 100); 

     } 

private void button1_Click(object sender, EventArgs e) 
     { 

      createlist(); //Calls function and creates the ListView 

      ListViewItem Source = new ListViewItem("Source", 0); 
      Source.Checked = true; 
      Source.SubItems.Add("7"); 
      Source.SubItems.Add("8"); 
      Source.SubItems.Add("9"); 

      MainList.Items.AddRange(new ListViewItem[] {Source}); 

     } 
} 
+0

こんにちは、リストビューMainList;メインクラスにすべての関数とプログラムが実行されますが、ボタンがクリックされるとエラーが発生します。 RCPYC Membership Program.exeで「System.NullReferenceException」の未処理の例外が発生しました 追加情報:オブジェクトのインスタンス –

+0

私の答えを編集しました。私の推測では、MainListは最初は何も設定されていないので、それは外に出てしまったのです。 – phishfordead

+0

完璧に働いた、ありがとう。 –

0

MainList、()関数は、その関数への単なるローカル変数で、その関数内でのみ使用することができます。他の関数でそれにアクセスできるようにするには、それをクラス変数にする必要があります。

+0

それを解決するにはもう一度やってください - あなたは 'DisplayPanel.Controls'コレクションでそれを見つけることもできます。 –

+0

@DStanley、それも正しいです。 – Shar1er80

+0

ありがとう、私はクラス変数に変更する方法については? –

1

MainListbutton1_Click方法の範囲ではないため、エラーが発生します。

これを解決するには2通りの方法があります。

  1. MainListをすべてのメソッドの外に置きます。このように、変数MainListはクラス全体のスコープに含まれているため、クラス内のすべてのメソッドがアクセスできます。

    ListView MainList; 
    public void createlist() 
    { 
        MainList = new ListView(); 
        DisplayPanel.Controls.Add(MainList); 
    
        MainList.View = View.Details; 
        MainList.GridLines = true; 
    
        MainList.Name = "MainList"; 
        MainList.Size = DisplayPanel.Size; 
        int s1 = DisplayPanel.Size.Height; 
        int s2 = DisplayPanel.Size.Width; 
        MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top); 
    
        MainList.Columns.Add("ProductName", 100); 
        MainList.Columns.Add("ProductName2", 100); 
        MainList.Columns.Add("ProductName3", 100); 
        MainList.Columns.Add("ProductName4", 100); 
    
    } 
    
    // your other method should be here... 
    
  2. 値をcreateListから返します。それは、クラス内のすべてのメソッドは、あなたがおそらく必要MainListにアクセスすることを可能にするため

    public ListView createlist() 
    { 
        MainList = new ListView(); 
        DisplayPanel.Controls.Add(MainList); 
    
        MainList.View = View.Details; 
        MainList.GridLines = true; 
    
        MainList.Name = "MainList"; 
        MainList.Size = DisplayPanel.Size; 
        int s1 = DisplayPanel.Size.Height; 
        int s2 = DisplayPanel.Size.Width; 
        MainList.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top); 
    
        MainList.Columns.Add("ProductName", 100); 
        MainList.Columns.Add("ProductName2", 100); 
        MainList.Columns.Add("ProductName3", 100); 
        MainList.Columns.Add("ProductName4", 100); 
        return MainList; 
    } 
    
    private void button1_Click(object sender, EventArgs e) 
        { 
    
         var listView = createlist(); //Calls function and creates the ListView 
    
         ListViewItem Source = new ListViewItem("Source", 0); 
         Source.Checked = true; 
         Source.SubItems.Add("7"); 
         Source.SubItems.Add("8"); 
         Source.SubItems.Add("9"); 
    
         listView.Items.AddRange(new ListViewItem[] {Source}); 
    
        } 
    

は、私が最初のソリューションをお勧めします。他の方法で MainListにアクセスしたくない場合は、2番目の解決方法を使用してください。

関連する問題