我正在使用LINQ在WPF应用程序中创建表,但是当我尝试使用事件方法访问其中一个表时,我的编译器告诉我“当前上下文中不存在名称'parts'”。我应该做些什么来调整范围,以便我可以从单独的方法访问var?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FinalExam_SupplierPartsWPF
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var suppliers = new[] {
new{SN = 1, SName = "Smith", Status = 20, City="London"},
new{SN = 2, SName = "Jones", Status = 10, City="Paris"},
new{SN = 3, SName = "Blake", Status = 30, City="Paris"},
new{SN = 4, SName = "Clark", Status = 20, City="London"},
new{SN = 5, SName = "Adams", Status = 30, City="Athens"}
};
var parts = new[] {
new{PN = 1, PName="Nut", Color = "Red", Weight = 12, City="London"},
new{PN = 2, PName="Bolt", Color = "Green", Weight = 17, City="Paris"},
new{PN = 3, PName="Screw", Color = "Blue", Weight = 17, City="Rome"},
new{PN = 4, PName="Screw", Color = "Red", Weight = 14, City="London"},
new{PN = 5, PName="Cam", Color = "Blue", Weight = 12, City="Paris"},
new{PN = 6, PName="Cog", Color = "Red", Weight = 19, City="London"}
};
var shipment = new[] {
new{SN = 1, PN = 1, Qty=300},
new{SN = 1, PN = 2, Qty=200},
new{SN = 1, PN = 3, Qty=400},
new{SN = 1, PN = 4, Qty=200},
new{SN = 1, PN = 5, Qty=100},
new{SN = 1, PN = 6, Qty=100},
new{SN = 2, PN = 1, Qty=300},
new{SN = 2, PN = 2, Qty=400},
new{SN = 3, PN = 2, Qty=200},
new{SN = 4, PN = 2, Qty=200},
new{SN = 4, PN = 4, Qty=300},
new{SN = 4, PN = 5, Qty=400}
};
IEnumerable<string> colorList = parts
.OrderBy(part => part.Color)
.Select(part => part.Color)
.Distinct();
foreach (string x in colorList)
cbxColorSelect.Items.Add(x);
}
private void ColorSelectedEvent(object sender, SelectionChangedEventArgs e)
{
lbxPartDisplay.Items.Add("test");
string colorChoice = cbxColorSelect.Text;
IEnumerable<string> partResults = parts
.Where(clr => String.Equals(clr.Color, colorChoice))
.Select(part => String.Format("{0}", part.PName));
foreach (string y in partResults)
lbxPartDisplay.Items.Add(y);
}
}
}
答案 0 :(得分:1)
parts
,suppliers
和shipments
变量在MainWindow()
方法的范围内声明;在此方法之外的任何地方都无法访问它们。如果要在同一个类中的另一个方法中访问这些变量,则应将它们声明为该类的私有。
声明变量时,通常会指定一个访问修饰符。在您的示例中,您使用var
关键字隐式创建变量。以这种方式创建的变量具有private
的默认访问修饰符。这意味着它们的范围限定为包含创建它们的块的范围,在您的情况下是MainWindow()
方法。正如其他人所建议的那样,我建议审查变量范围和访问修饰符。您需要扎实掌握这些基础知识才能提高效率。
在初学者的某些C#基础知识上查看this频道9视频系列;具体而言,第5集侧重于变量。 This博客文章还介绍了有关变量范围的一些基础知识。
用于变量声明的var
关键字表示根据赋值隐式定义变量。这意味着编译器将查看您为变量分配的内容(即:等号右侧的内容)并找出类型。对于technical reasons,您不能将var
声明运算符用于在类级别定义的变量(如果它们是类的私有,通常也称为“字段”)。
由于您无法使用var
关键字来定义类级变量,因此必须明确指定类型。在下面的示例中,我创建了一个类,它表示您在示例中使用的原始parts
匿名类型。
我也同意其他人关于开始使用控制台应用程序学习C#的建议。 GUI应用程序带来了许多其他细微差别,只会让您感到困惑,并在学习语言时造成普遍的挫败感。例如:具有新值的updating a textbox from the non GUI thread之类的简单事物可能会炸毁您的程序并让您想知道它为什么不起作用。
您可以选择继续使用一组匿名类型,但是您需要将其声明为dynamic
或object
。使用一组匿名对象可能会更具挑战性。我建议您为类字段使用已定义的类型(例如下面所示的一个part
类)。
例如:
public class Part
{
public int PN { get; set; }
public String PName { get; set; }
public String Color { get; set; }
public int Weight { get; set; }
public String City { get; set; }
}
public partial class MainWindow : Window
{
private List<Part> _parts;
public MainWindow()
{
InitializeComponent();
_parts.Add(new Part() { PN = 1, PName = "Nut", Color = "Red", Weight = 12, City = "London" });
_parts.Add(new Part() { PN = 2, PName = "Bolt", Color = "Green", Weight = 17, City = "Paris" });
_parts.Add(new Part() { PN = 3, PName = "Screw", Color = "Blue", Weight = 17, City = "Rome" });
_parts.Add(new Part() { PN = 4, PName = "Screw", Color = "Red", Weight = 14, City = "London" });
_parts.Add(new Part() { PN = 5, PName = "Cam", Color = "Blue", Weight = 12, City = "Paris" });
_parts.Add(new Part() { PN = 6, PName = "Cog", Color = "Red", Weight = 19, City = "London" });
}
private void SomeMethod()
{
string colorChoice = "Blue";
IEnumerable<string> partResults = _parts
.Where(clr => String.Equals(clr.Color, colorChoice))
.Select(part => String.Format("{0}", part.PName));
}
}