根据特定属性从列表中选择和显示某些项目

时间:2015-12-07 14:50:37

标签: c#

我有一个保存在文本文件中的对象列表,可以显示在表单上。但是现在我需要一个按钮,它只显示基于属性的列表中的某些对象,在我的案例中。下面是我尝试使用的代码,但无法使其工作。

   private void brandToolStripMenuItem_Click(object sender, EventArgs e)
    {
        List<Car> BrandSelect = new List<Car>(cars);

        var SelectBrand = from c in BrandSelect
                         where c.Brand == textBox1.Text
                         select c;

        DisplayCar();
    }

下面是完整的代码,如果需要更多信息,感谢您的帮助。

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

namespace Car_Manager
{
    public partial class Form1 : Form
    {
    string currentfile;
    Car c;
    int curIndex = -1;
    List<Car> cars = new List<Car>();
    public Form1()
    {
        InitializeComponent();
        c = new Car();
        saveFileDialog1.CreatePrompt = true;
        saveFileDialog1.OverwritePrompt = true;
        saveFileDialog1.FileName = "myText";
        saveFileDialog1.DefaultExt = "txt";
        saveFileDialog1.Filter =
            "Text files (*.txt)|*.txt|All files (*.*)|*.*";
    }

    public void clearForm()
    {
        txtBrand.Text = "";
        txtModel.Text = "";
        txtYear.Text = "";
        txtPrice.Text = "";
        txtNumMiles.Text = "";
        txtInformation.Text = "";
        radAutomatic.Checked = false;
        radManual.Checked = false;
        radConvertible.Checked = false;
        radCoupe.Checked = false;
        radEstate.Checked = false;
        radHatchback.Checked = false;
        radHPV.Checked = false;
        radSaloon.Checked = false;
        radSUV.Checked = false;


    }

    private void DisplayCar()
    {
        txtBrand.Text = c.Brand;
        txtModel.Text = c.Model;
        txtYear.Text = c.Year;
        txtPrice.Text = c.Price;
        txtNumMiles.Text = c.NumMiles;
        DisplayBody();
        DisplayGear();
        string str = "";
        for (int i = 0; i < c.Information.Count(); i++)
            str += c.Information[i] + "\r\n";
        txtInformation.Text = str;

    }

    private void FormToObject()
    {
        c.Brand = txtBrand.Text;
        c.Model = txtModel.Text;
        c.Year = txtYear.Text;
        c.Price = txtPrice.Text;
        c.NumMiles = txtNumMiles.Text;
        BodyCheck();
        GearCheck();
    }

    private void BodyCheck()
    {
        if (radHatchback.Checked == true)
        { c.Body = radHatchback.Text; }

        else if (radHPV.Checked == true)
        { c.Body = radHPV.Text; }

        else if (radSUV.Checked == true)
        { c.Body = radSUV.Text; }

        else if (radSaloon.Checked == true)
        { c.Body = radSaloon.Text; }

        else if (radConvertible.Checked == true)
        { c.Body = radConvertible.Text; }

        else if (radCoupe.Checked == true)
        { c.Body = radCoupe.Text; }

        else if (radEstate.Checked == true)
        { c.Body = radEstate.Text; }

    }

    private void DisplayBody()
    {
        if (c.Body == "Hatchback")
        { radHatchback.PerformClick(); }

        else if (c.Body == "HPV")
        { radHPV.PerformClick(); }

        else if (c.Body == "SUV")
        { radSUV.PerformClick(); }

        else if (c.Body == "Convertible")
        { radConvertible.PerformClick(); }

        else if (c.Body == "Saloon")
        { radSaloon.PerformClick(); }

        else if (c.Body == "Coupe")
        { radSaloon.PerformClick(); }

        else if (c.Body == "Estate")
        { radEstate.PerformClick(); }
    }

    private void GearCheck()
    {
        if (radAutomatic.Checked == true)
        { c.GearBox = radAutomatic.Text; }

        else if (radManual.Checked == true)
        { c.GearBox = radManual.Text; }
    }

    private void DisplayGear()
    {
        if (c.GearBox == "Manual")
        { radManual.PerformClick(); }

        else if (c.GearBox == "Automatic")
        { radAutomatic.PerformClick(); }
    }

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {

        openFileDialog1.ShowDialog();            
        currentfile = openFileDialog1.FileName;
        saveToolStripMenuItem.Enabled = true;            
        Stream s1 = openFileDialog1.OpenFile();            
        StreamReader reader = new StreamReader(s1);

        while (reader.Peek() != -1)
        {              
            string str = reader.ReadLine();
            Car c = new Car();
            c.ReadString(str);
            cars.Add(c);
        }

        curIndex = 0;
        c = cars[curIndex];
        DisplayCar();
        reader.Close();
    }

    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // Save everything in a dialog box
        saveFileDialog1.ShowDialog();
        // Open the file and save the information
        Stream textOut = saveFileDialog1.OpenFile();
        StreamWriter writer = new StreamWriter(textOut);

        FormToObject();
           string str = c.GetToString();
            writer.WriteLine(str);
            writer.Close();

    }

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        // Save the file with the current file name
        FileStream f1 = new FileStream(currentfile, FileMode.Create, FileAccess.Write);
        StreamWriter writer = new StreamWriter(f1);
        // get the object into a string
        FormToObject();

        StreamWriter file = new System.IO.StreamWriter(f1);
        cars.ForEach(file.WriteLine);
        file.Close();


    }

    private void btnAddInfo_Click(object sender, EventArgs e)
    {
        c.Information.Add(txtAddInfo.Text);
        string str = "";
        for (int i = 0; i < c.Information.Count(); i++)
            str += c.Information[i] + "\r\n";
        txtInformation.Text = str;
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        txtInformation.Text = "";
    }

    private void addToolStripMenuItem_Click(object sender, EventArgs e)
    {

    }

    private void btnPreviousCar_Click(object sender, EventArgs e)
    {
        curIndex--;
        if (curIndex < 0)

            curIndex = cars.Count - 1;
        c = cars[curIndex];
        DisplayCar();
    }

    private void btnNextCar_Click(object sender, EventArgs e)
    {
        curIndex++;
        if (curIndex >= cars.Count)

            curIndex = 0;
        c = cars[curIndex];
        DisplayCar();

    }

    private void button1_Click(object sender, EventArgs e)
    {

        int a = cars.Count;
        textBox1.Text = Convert.ToString(cars[2]);
    }

    private void btnEditCar_Click(object sender, EventArgs e)
    {
        txtBrand.ReadOnly = false;
        txtModel.ReadOnly = false;
        txtYear.ReadOnly = false;
        txtPrice.ReadOnly = false;
        txtNumMiles.ReadOnly = false;
        txtAddInfo.ReadOnly = false;

    }

    private void copyToolStripMenuItem_Click(object sender, EventArgs e)
    {

    }

    private void brandToolStripMenuItem_Click(object sender, EventArgs e)
    {
        List<Car> BrandSelect = new List<Car>(cars);

        var SelectBrand = from c in BrandSelect
                         where c.Brand == textBox1.Text
                         select c;

        DisplayCar();
    }

    private void yearToolStripMenuItem1_Click(object sender, EventArgs e)
    {


    }
}

class Car
{
    //List of properties
    private string brand;
    private string model;
    private string year;
    private string price;
    private string numMiles;
    private string body;
    private string gearbox;
    private List<string> information;

    //Constructor

    public Car() //Default Constructor
    {
        brand = "Unknown";
        model = "Unknown";
        year = "Unknown";
        price = "Unknown";
        numMiles = "Unknown";
        information = new List<string>();
    }

    public Car(string str)
    {
        information = new List<string>();
        ReadString(str);
    }

    public void ReadString(string str)
    {
        string[] words = str.Split('|');
        int Nwords = words.Count();
        brand = words[0];
        model = words[1];
        year = words[2];
        price = words[3];
        numMiles = words[4];
        body = words[5];
        gearbox = words[6];
        information.Clear();
        for (int i = 7; i < Nwords; i++)
            information.Add(words[i]);
    }

    //Methods
    public string Brand
    {
        get { return brand; }
        set { brand = value; }
    }

    public string Model
    {
        get { return model; }
        set { model = value; }
    }

    public string Year
    {
        get { return year; }
        set { year = value; }
    }

    public string Price
    {
        get { return price; }
        set { price = value; }
    }

    public string NumMiles
    {
        get { return numMiles; }
        set { numMiles = value; }
    }

    public string Body
    {
        get { return body; }
        set { body = value; }
    }

    public string GearBox
    {
        get { return gearbox; }
        set { gearbox = value; }
    }

    public List<string> Information
    {
        get { return information; }
        set { information = value; }
    }

    public string GetToString()
    {
        string str = "";
        str += brand + "|";
        str += model + "|";
        str += year + "|";
        str += price + "|";
        str += numMiles + "|";
        str += body + "|";
        str += gearbox + "|";
        for (int i = 0; i < information.Count(); i++)
            str += information[i] + "|";
        return str;
    }

}

}

1 个答案:

答案 0 :(得分:0)

我注意到的第一件事:

private void brandToolStripMenuItem_Click(object sender, EventArgs e)
{
    // You already have list of cars, this line will copy your list
    // into a new one, which is unnecessary work (you don't use it later).
    // You don't need this:
    List<Car> BrandSelect = new List<Car>(cars);

    // the "c" here is not the "c" that is the field of your form
    // it's a part of the syntax of linq query
    var SelectBrand = from c in BrandSelect
                     where c.Brand == textBox1.Text
                     select c;

    // This method displays what is in the field "c" (this.c)
    // ... and the content of "c" didn't change at all
    DisplayCar();
}

这里的代码应该是,例如:

private void brandToolStripMenuItem_Click(object sender, EventArgs e)
{
     //beware this can be null
     this.c = (from a in this.cars 
               where a.Brand == textBox1.Text 
               select a).FirstOrDefault();
}

[msdn] introduction to linq queries