-3

私はClassess:Person、Student、Teacherを持っています

人物クラスは次のとおりです。

public class Person
{
    private string firstname;
    private string lastname;
    private string email;

    public Person()
    {
    }
    public int CompareTo(Person b)
    {

        return this.Email.CompareTo(b.Email);
    }

    public Person(string firstname, string lastname, string email)
    {
        this.Firstname = firstname;
        this.Lastname = lastname;
        this.Email = email;
    }

    public string Firstname{get;set;}       
    public string Lastname{get;set;}
    public string Email{get;set;}


    public virtual string  GetDisplayText(string sep)
    {
        return Firstname + sep + Lastname + sep + Email;
    }

}

学生クラス:

public class Students : Person
{
    private double assessmentGrade;
    private double assignmentGrade;

    public Students()
    {
    }

    public Students(string firstname, string lastname, 
                    double assessmentGrade,double assignmentGrade,
                    string email) : base(firstname, lastname, email)
    {
        this.AssessmentGrade = assessmentGrade;
        this.AssignmentGrade = assignmentGrade;
    }

    public double AssignmentGrade{get;set;}
    public double AssessmentGrade{get;set;}

    public override string GetDisplayText(string sep)
    {
        return base.GetDisplayText(sep) + "   " + 
               AssessmentGrade + "   " + AssignmentGrade;
    }

}

教師クラス:

public class Teacher : Person
{
    private int roomNumber;

    public Teacher()
    {
    }

    public Teacher(string firstname, string lastname, int roomNumber,
        string email) : base(firstname, lastname, email)
    {
        this.RoomNumber = roomNumber;
    }

    public int RoomNumber{get;set;}
     public override string GetDisplayText(string sep)
    {
        return base.GetDisplayText(sep) + " , RoomNo " + RoomNumber;
    }

}

もう1つのPersonListクラスがあります。

public class PersonList : List<Person>
{
    List<Person> person = new List<Person>();

    public delegate void ChangeHandler(PersonList persons);
    public event ChangeHandler Changed;

    public bool Contains(string email)
    {
        return this[email] != null;
    }

    public new void Add(Person p)
    {
        base.Insert(0, p);
    }

    // Provide two additional methods
    public void Fill()
    {
        List<Person> persons = PersonDB.GetPersons();
        foreach (Person person in persons)
            base.Add(person);
    }

    public void remove(Person persons)
    {
        person.Remove(persons);
    }

    public static PersonList operator +(PersonList persons, Person p)
    {
        persons.Add(p);
        return persons;

    }
    public static PersonList operator -(PersonList persons, Person p)
    {
        persons.remove(p);
        return persons;
    }

    public void Save()
    {

        PersonDB.SavePersons(this);
    }
}

今、私はForm2からデータをアップロードしようとしています。

private PersonList persons = new PersonList();

             private void button2_Click(object sender, EventArgs e)
    {
        int i = 0;
        Form2 update = new Form2();
        Person updteDtl = (Person)lstPerson.SelectedItem;

        if (lstPerson.SelectedIndex != -1)
        {
            for (int j = 0; j < persons.Count; j++)
            {
                if (persons[j] == updteDtl)
                {
                    i = j;
                    break;
                }
            }
            update.UpdatingData = updteDtl;
            Person updatePerson = update.GetNewPerson();

            if (updatePerson != null)
            {
                persons[i] = updatePerson;
            }
        }
        else
        {
            MessageBox.Show("Select the person to update.");
        }

    }

Form2でデータをアップロードしようとしています。

private Person person = null;

    public Person GetNewPerson()
    {
        this.ShowDialog();
        return person;
    }
         private Person updatingData = new Person();
    public Person UpdatingData
    {
        set { updatingData = value; }
    }
    private void Form2_Load(object sender, EventArgs e)
    {
         if (updatingData is Students)
        {
            Students std = (Students)updatingData;

            txtName.Text =  std.Firstname;
            txtLName.Text = std.Lastname;
            txtEmail.Text = std.Email;
            txtAssessGrade.Text = std.AssessmentGrade.ToString();
            txtAssigGrade.Text = std.AssignmentGrade.ToString();
        }
        else if (updatingData is Teacher)
        {
            rbTeacher.Checked = true;
            Teacher teacher = (Teacher)updatingData;

            txtName.Text = teacher.Firstname;
            txtLName.Text = teacher.Lastname;
            txtEmail.Text = teacher.Email;
            txtAssessGrade.Text = teacher.RoomNumber.ToString();

        }                     
    }

リストボックスで選択したForm2からデータを取得し、そのデータを更新したいのですが、これを実行して更新ボタンをクリックすると、「System.String」タイプのオブジェクトを「ProductMaint.Person」タイプにキャストできませんというエラーが表示されます。 '。修正方法を教えてください。

4

2 に答える 2

1

この行が例外をスローしていると思います:

Person updteDtl = (Person)lstPerson.SelectedItem;

つまり、 で選択された項目はlstPersonではなく文字列であるPersonため、 にキャストすることはできませんPerson

残念ながら、あなたは何百行ものコードを私たちに見せてくれたという事実にもかかわらずlstPersonあなたが. (あなたが書いているアプリの種類さえ教えてくれませんでした。) lstPerson.SelectedItemPerson

それが問題の原因であり、投稿したコードとはほとんど関係がないため、その部分に注目してください。リストへのバインド方法を変更するか、 にある文字列に基づいて関連人物を取得する方法を考え出してSelectedItemください。

于 2012-08-18T19:29:34.423 に答える
0

私の推測では、問題は次の行に起因していると思います。

Person updteDtl = (Person)lstPerson.SelectedItem;

どうやらこれはオブジェクトではなく文字列を返しPersonます。のインスタンスなどのオブジェクトをドロップダウンリストに格納できるかどうかは実際にはわかりませんPerson(それが何lstPersonであると思いますか?)。

解決策は、フィールドの1つを使用して各人を識別し、それをドロップダウンの項目の値として使用することです(たとえば、電子メールは各人に固有である可能性がありますか?それ以外の場合は、次の新しいフィールドPersonIdを追加します。まさにこの目的)。ドロップダウンリストの各項目には、表示するフィールドとテキスト文字列の両方を含めることvalueができるため、IDを値として使用し、名前(または任意の名前)を表示テキストに使用できます。

次に、イベントハンドラーで、を取得しvalue、それを使用してリスト内の人物を検索する必要がありますPerson。その後、フォームの残りのデータでその人を更新できます。

私はあなたの質問を正しく理解したことを願っています、そしてこれがいくつかの助けになるのに十分明確であることを願っています、幸運を祈ります!

于 2012-08-18T19:44:04.397 に答える