none
簡易家計簿のフォーム処理について RRS feed

  • 質問

  •  //と記載されているところにエラーが発生します。

    エラー内容は「アクセスできない保護レベルになっています」と記載されえています。

    なぜこのようにエラーが発生するのかわかりません。

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void buttonAdd_Click(object sender, EventArgs e)
            {
                ItemForm frmItem = new ItemForm(categoryDataSet1);
                DialogResult drRet = frmItem.ShowDialog();

                if (drRet == DialogResult.OK)
                {
                    moneyDataSet.moneyDataTable.AddmoneyDataTableRow(
    //アクセスできない保護レベルになっています。
                        frmItem.monCalendar.SelectionRange.Start, //monCalendarにエラー
                        frmItem.cmbCategory.Text, //cmbCategory
                        frmItem.txtItem.Text, //txtItem

                        int.Parse(frmItem.mtxtMoney.Text), //mtxtMoney
                        frmItem.txtRemarks.Text); //txtRemarks

                }

            }

            private void Form1_Load(object sender, EventArgs e)
            {
                categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("給料", "入金");

                categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("食費", "出金");

                categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("雑費", "出金");

                categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("住居", "出金");

            }
        }
    }

         
    2018年3月3日 10:23

回答

  • ItemForm内に定義したmoneyDataTableフィールドあるいはプロパティのアクセス修飾子がpublicと指定されていないからでしょう。

    クラスの外側からアクセスできるのはpublicだけとなっており、privateかprotectedだとクラスの外側からはアクセスはできません。
    (フィールドやプロパティで指定されていない場合はprivateとして扱われます)
    internalはdllなどに分割しなければアクセスできます。




    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2018年3月3日 10:46

すべての返信

  • ItemForm内に定義したmoneyDataTableフィールドあるいはプロパティのアクセス修飾子がpublicと指定されていないからでしょう。

    クラスの外側からアクセスできるのはpublicだけとなっており、privateかprotectedだとクラスの外側からはアクセスはできません。
    (フィールドやプロパティで指定されていない場合はprivateとして扱われます)
    internalはdllなどに分割しなければアクセスできます。




    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2018年3月3日 10:46
  • gekka さんと同意見です。

    monCalendar, cmbCategory, txtItem など、名前的に、画面に配置したコントロールな気がしますが、
    画面デザインを開いて、対象コントロールを選択
     →プロパティウィンドウ
     →Modifiers の値を、Private から任意のアクセスレベルに変更することで、
    クラスの外側からアクセス可能になります。



    また、ちょっとレベルアップするならば、直接コントロールにアクセスするやり方を止めて、外側とやり取りする用のプロパティをItemForm クラス内に新しく設けて(この中で、やり取りしたいコントロールのメンバーを取得したり、返却したりする)、このプロパティ経由でアクセスするやり方があります。
    2018年3月16日 1:14