如何在不使用C#Winforms数据库的情况下在List上使用DatagridView

时间:2018-03-15 04:57:18

标签: c# winforms datagridview

在我的项目中,我想从文件中读取数据并将DataGridView更新为简单的List。我希望这样,以便列表可以在运行时更新,然后在保存时希望列表的最终内容更新为文件。

在谷歌搜索中看到的大多数解决方案中,我想出了如何使用DatagridView和数据库连接来更新DatagridView的示例。用于插入,更新和删除操作。我的答案的很多建议包括添加INotifyProperty和基于IBindingList的要求,这可能是一种过度杀伤。

我的目的只是发布我的解决方案,其中涉及使用Datagridview来更新列表。这里使用的代码片段是一个庞大的项目的一部分,在这个项目中,将数据从Datagridview更新到List并返回是一个非常大的挑战,因为数据库的初始需要被删除。

在发布这个问题时,我找到了解决问题的方法。为了解决这个问题,我从以前的各种问题中得到了一些建议。我不是在评论中寻找建议。如果有人想告诉我更好的方法来解决这个问题,请用工作代码发布答案。

2 个答案:

答案 0 :(得分:2)

因此,阅读后,您将拥有一系列MyData对象。您希望在DataGridView中显示所有MyData对象(或子部分)。

操作员可以更改显示的值,添加一些新行或删除行。有些列可能是只读的,无法更改

按下OK按钮后,您想要从DataGridView中读取所有MyData对象并将它们保存在文件中。

您的大多数工作都可以使用表单设计器完成。

  • 在设计器中打开表单类
  • 在此表单上拖动DataGridView
  • 在此表单上拖动BindingSource
  • 右键单击BindingSource并选择属性
  • 单击右侧箭头上DataSource中的属性窗口
  • 如果在那里看不到MyData,请选择添加项目数据源
  • 在新窗口中选择对象
  • 选择添加的数据源作为BindingSource的数据源
  • 在DataGridView的属性中,将bindingSource分配给DataSource

然后突然:您的DataGridView具有MyData公共属性的列。奇迹般地,列具有正确的类型。他们能够显示值。只读属性只有列,读写属性是可编辑的。

显示您的数据:

void FillDataGridView(IEnumerable<MyData> dataToDisplay)
{
    this.bindingSource1.DataSource = new BindingList<MyData>(dataToDisplay.ToList();
}

编辑后读取所有数据

IEnumerable<MyData> ReadDataGridView()
{
    return this.bindingSource1.List.Cast<MyData>();
}

这使操作员可以添加和删除行并编辑值。 如果您不希望操作员执行此操作,请调整DataGridView属性 如果列的显示值不符合您的喜好,请编辑列属性(不同的标题文本,不同的显示格式,不同的背景颜色等)

答案 1 :(得分:0)

这是一个示例,我使用DatagridView在列表上执行插入更新和删除(类对象列表PersonState)。

DatagridView的数据源需要包含一个DataTable,以弥合这个差距,我使用了一个名为ConvertToDatatable()的函数。

作为我的出发点,我从Anup Kumar Sharma在另一个link建议的项目开始。

enter image description here

使用以下代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;

namespace InsertUpdateDelete {
    public partial class Form1 : Form {
        public class PersonState {
            public string Name { get; set; }
            public string State { get; set; }
        }
        public List<PersonState> listOfPersonState;
        public Form1() {
            InitializeComponent();
            listOfPersonState = new List<PersonState>();
        }
        //Display Data in DataGridView  
        private void DisplayData() {
            DataTable dt = new DataTable();
            dt = ConvertToDatatable();
            dataGridView1.DataSource = dt;
        }
        //Clear Data  
        private void ClearData() {
            txt_Name.Text = "";
            txt_State.Text = "";
        }
        public DataTable ConvertToDatatable() {
            DataTable dt = new DataTable();
            dt.Columns.Add("Name");
            dt.Columns.Add("State");
            foreach (var item in listOfPersonState) {
                var row = dt.NewRow();
                row["Name"] = item.Name;
                row["State"] = item.State;
                dt.Rows.Add(row);
            }
            return dt;
        }
        private void AddToList(string text1, string text2) {
            listOfPersonState.Add(new PersonState { Name = text1, State = text2 });
        }
        private void UpdateToList(string text1, string text2) {
            int index = dataGridView1.SelectedRows[0].Index;
            listOfPersonState[index] = new PersonState { Name = text1, State = text2 };
        }
        private void DeleteToList() {
            int index = dataGridView1.SelectedRows[0].Index;
            listOfPersonState.RemoveAt(index);
        }
        private void btn_Insert_Click(object sender, EventArgs e) {
            if (txt_Name.Text != "" && txt_State.Text != "") {
                AddToList(txt_Name.Text, txt_State.Text);
                //MessageBox.Show("Record Inserted Successfully");
                DisplayData();
                ClearData();
            } else {
                MessageBox.Show("Please Provide Details!");
            }
        }
        private void btn_Update_Click(object sender, EventArgs e) {
            if (txt_Name.Text != "" && txt_State.Text != "") {
                if (dataGridView1.SelectedRows != null && dataGridView1.SelectedRows.Count > 0) {
                    UpdateToList(txt_Name.Text, txt_State.Text);
                    //MessageBox.Show("Record Updated Successfully");
                    DisplayData();
                    ClearData();
                }    
            } else {
                MessageBox.Show("Please Select Record to Update");
            }
        }
        private void btn_Delete_Click(object sender, EventArgs e) {
            if (dataGridView1.SelectedRows != null && dataGridView1.SelectedRows.Count > 0) {
                DeleteToList();
                //MessageBox.Show("Record Deleted Successfully!");
                DisplayData();
                ClearData();
            } else {
                MessageBox.Show("Please Select Record to Delete");
            }
        }

        private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
            FillInputControls(e.RowIndex);
        }
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
            FillInputControls(e.RowIndex);
        }
        private void FillInputControls(int Index) {
            if (Index > -1) {
                txt_Name.Text = dataGridView1.Rows[Index].Cells[0].Value.ToString();
                txt_State.Text = dataGridView1.Rows[Index].Cells[1].Value.ToString();
            }
        }
    }
}

<强>学习:

  1. 注意我在课堂上使用了属性。
  2. 而不是使用:

    public class PersonState {
        public string Name;
        public string State;
    }
    

    我用过:

    public class PersonState {
        public string Name { get; set; }
        public string State { get; set; }
    }
    

    出于某种原因,前者在尝试分配价值时不起作用。

    1. 我已经将对象列表变成了一个类变量 函数可以直接访问该列表而不是传递它 作为参数。

      public List<PersonState> listOfPersonState;

    2. 我将逻辑替换为插入,更新和删除到数据库,插入 更新并删除到列表。

      private void AddToList(string text1, string text2) {
          listOfPersonState.Add(new PersonState { Name = text1, State = text2 });
      }
      private void UpdateToList(string text1, string text2) {
          int index = dataGridView1.SelectedRows[0].Index;
          listOfPersonState[index] = new PersonState { Name = text1, State = text2 };
      }
      private void DeleteToList() {
          int index = dataGridView1.SelectedRows[0].Index;
          listOfPersonState.RemoveAt(index);
      }
      
    3. 注意:我直接从List中分配Grid,因此我的Grid和我的List总是具有相同的索引,因为我使用Display函数来确保插入,更新和删除Button操作。

      private void DisplayData() {
          DataTable dt = new DataTable();
          dt = ConvertToDatatable();
          dataGridView1.DataSource = dt;
      }
      public DataTable ConvertToDatatable() {
          DataTable dt = new DataTable();
          dt.Columns.Add("Name");
          dt.Columns.Add("State");
          foreach (var item in listOfPersonState) {
              var row = dt.NewRow();
              row["Name"] = item.Name;
              row["State"] = item.State;
              dt.Rows.Add(row);
          }
          return dt;
      }