代码之家  ›  专栏  ›  技术社区  ›  Ganesh Kamath - 'Code Frenzy'

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

  •  1
  • Ganesh Kamath - 'Code Frenzy'  · 技术社区  · 6 年前

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

    在google search上看到的大多数解决方案中,我给出了如何使用DatagridView和用于更新DatagridView的数据库连接的示例。对于插入、更新和删除操作。对于我的回答,有很多建议包括添加INotifyProperty和基于IBindingList的推进,这可能有些过头了。

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Harald Coppoolse    6 年前

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

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

    按下OK按钮后,您希望从DataGridView读取所有MyData对象并将其保存在文件中。

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

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

    突然,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属性 如果列的显示值不符合您的喜好,请编辑列属性(不同的标题文本、不同的显示格式、不同的背景色等)

        2
  •  0
  •   Ganesh Kamath - 'Code Frenzy'    6 年前

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

    DatagridViews数据源需要包含一个DataTable,为了弥补这个差距,我使用了一个名为 ConvertToDatatable()

    作为我的出发点,我从另一个网站上建议的一个项目开始 link 作者:Anup Kumar Sharma。

    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. 请注意,我在类中使用了属性。

    而不是使用:

    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. 我将插入、更新和删除的逻辑替换为DB,插入 更新并删除到列表。

      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 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;
    }