C#列表和datagridviews

时间:2014-07-26 23:43:50

标签: c#

我尝试使用列表中的信息填充数据网格,然后在按下保存按钮后将数据网格更改保存回列表中。

    int pos = MainMenu.myList.FindIndex(x => x.ID == validID);
    var tempStu = MainMenu.myList[pos];
    if (tempStu is DormStudent)
    {
        DormStudent tempDorm = tempStu as DormStudent;
        nameTextBox.Text = tempDorm.Name;
        var blist = new BindingList<Student>(tempDorm.Grades);
        var source = new BindingSource(blist, null);
        gradesDataGridView.DataSource = source;
    }
    else
    {
        nameTextBox.Text = tempStu.Name;
        var blist = new BindingList<Student>(tempStu.Grades);
        var source = new BindingSource(blist, null);
        gradesDataGridView.DataSource = source;
    }

当你按下保存按钮时(我没有保存部分那么好)

    int pos = MainMenu.myList.FindIndex(x => x.ID == validID);
    var tempStu = MainMenu.myList[pos];
    if (tempStu is DormStudent)
    {
        DormStudent tempDorm = tempStu as DormStudent;
        tempDorm.Grades = gradesDataGridView;
        MainMenu.myList[pos] = tempDorm;
    }
    else
    {
        tempStu.Grades = gradesDataGridView;
        MainMenu.myList[pos] = tempStu;
    }

这里是成绩所在的学生班。

    public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public List<int> Grades;
        public Student()
        {
            ID = 0;
            Name = "No Student";
            Grades = new List<int>();
        }
        public Student(int i, string n)
        {
            ID = i;
            Name = n;
            Grades = new List<int>();
        }
    }

我无法在按下检查按钮时将列表转换为数据网格,或者在按下保存按钮时将列表转换回数据网格。任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

查看代码我主要看一个问题。但请注意,我远不是数据绑定方面的专家!

我发现您正在为BindingList<>类型创建Student。我希望你真的想要自上而下地显示一个学生的成绩。

如果您真的想要从左到右显示所有学生自上而下和他们的成绩,您将不得不做一些严重的扭曲!

现在BindingList应绑定Grades而不是Student,因此第一个想法是将其更改为BindingList<int>

然而afaik未命名的变量会导致错误DataMembers。要显示它们,数据应为Properties

所以我创建了一个包含整数的新类Grade。为了更好的衡量,我还添加了一个字符串Test来保存测试的描述。如果你不想要它,请把它拿出来!

public class Grade
{
    public int Points  { get; set; }
    public string Test { get; set; }

    public Grade()
    { Points = 0; Test = "No Test"; }

    public Grade(int points, string test)
    { Points = points; Test = test; }
}

这要求更改Student类:

public List<Grade> Grades;

和(两次)

Grades = new List<Grade>();

创建BindingList的两行现在看起来像这样:

var blist = new BindingList<Grade>(tempDorm.Grades);
var blist = new BindingList<Grade>(tempStu.Grades);

好消息是,不仅数据现在正好加载到DataGridView;还有根本不需要保存操作,因为数据绑定双向,并且每个更改实际发生在List中!

只有在需要撤销功能时才需要更多编码,但这是另一回事......