0

Windowsフォームを操作するための「プログラミングC#4.0、第6版」の例に従っていますが、実際に何が起こっているのか理解できないところまで来ています。私は3つのファイルを持っています:1つはMain()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace ToDoList
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

フォームのフィールドを操作するための1つ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


    public class ToDoEntry
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime DueDate { get; set; }


}

そしてフォーム自体:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ToDoList
{
    public partial class Form1 : Form
    {

        private BindingList<ToDoEntry> entries = new BindingList<ToDoEntry>();

        public Form1()
        {
            InitializeComponent();
            entriesSource.DataSource = entries;
            CreateNewItem();
        }

        private void bindingSource1_CurrentChanged(object sender, EventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void CreateNewItem()
        {
            ToDoEntry newEntry = (ToDoEntry)entriesSource.AddNew();
            newEntry.Title = "New entry";
            newEntry.DueDate = DateTime.Now;
            entriesSource.ResetCurrentItem();
        }

        private void entriesSource_ListChanged(object sender, ListChangedEventArgs e)
        {
            switch (e.ListChangedType)
            {
                case ListChangedType.ItemAdded:
                    MakeListViewItemForNewEntry(e.NewIndex);
                    break;
                case ListChangedType.ItemDeleted:
                    RemoveListViewItem(e.NewIndex);
                    break;
                case ListChangedType.ItemChanged:
                    UpdateListViewItem(e.NewIndex);
                    break;
            }
        }

        private void MakeListViewItemForNewEntry(int newItemIndex)
        {
            ListViewItem item = new ListViewItem();
            item.SubItems.Add("");
            entriesListView.Items.Insert(newItemIndex, item);
        }

        private void UpdateListViewItem(int itemIndex)
        {
            ListViewItem item = entriesListView.Items[itemIndex];
            ToDoEntry entry = entries[itemIndex];
            item.SubItems[0].Text = entry.Title;
            item.SubItems[1].Text = entry.DueDate.ToShortDateString();
        }

        private void RemoveListViewItem(int deletedItemIndex)
        {
            entriesListView.Items.RemoveAt(deletedItemIndex);
        }
    }
}

私の問題は、entriesListViewという名前が現在のコンテキストに存在しないということです。それは本当ですが、例えばentriesSource.DataSource = entries;

どちらも持っていませんentriesSourceが、どういうわけか使えます。不足しているクラス(少なくともクラスである必要があると思います)がVS2010(はい、Visual Studio 2010を使用しています)が生成する必要があるかどうかはわかりませんが、なぜ生成されないのですか?

手動で書く必要があるものですが、例ではこれについて何もありません。私も定義方法がわかりませんentriesListView

4

1 に答える 1

2

これらの変数は、デザイナー ファイルで Visual Studio によって作成されています。これはpartial、クラス定義を 2 つ以上のファイルに分割できる C# の機能であるキーワードを使用して行われます。

Form1.designer.csこのインスタンスでは、デザイナー ファイルが呼び出されます。このファイルを開くか、Visual Studio を使用している場合は Visual Studio Designer でフォームを開くと、作成されたコントロールを確認できます。Visual Studio でデザイナー ファイルを開くにはForm1.cs、ソリューション エクスプローラーの TreeView でエントリを展開し、デザイナー ファイルをダブルクリックします。

上記のコードでは、entriesListView変数が存在しないことが問題のようです。ある時点で作成され、その後削除された可能性があります (これは、Visual Studio のバグが原因で誤って発生することもあります)。フォームに新しい ListView を追加し、Nameプロパティを に設定するとentriesListView、問題が解決するはずです。

于 2013-01-22T14:57:14.030 に答える