我正在使用“编程C#4.0,第6版”中的示例来处理Windows窗体,但我发现我无法理解实际发生的情况。我有3个文件
一个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());
}
}
}
使用表格的字段:
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
。
答案 0 :(得分:2)
这些变量由Visual Studio在设计器文件中创建。这是通过使用partial
关键字来完成的,这是C#中的一项功能,允许您将类定义拆分为两个或多个文件。
在此实例中,设计器文件将被称为Form1.designer.cs
。您可以通过打开此文件来查看已创建的控件,或者,如果使用Visual Studio,则可以通过在Visual Studio Designer中打开表单来查看。要在Visual Studio中打开设计器文件,请展开Solution Explorer TreeView中的Form1.cs
条目,然后双击设计器文件。
在上面的代码中,问题似乎是entriesListView
变量不存在。它可能是在某一点创建的,然后被删除(这甚至可能由于Visual Studio错误而无意中发生)。向表单添加新的ListView并将Name
属性设置为entriesListView
可以解决问题。