在我的项目中,我想从文件中读取数据并将DataGridView更新为简单的List。我希望这样,以便列表可以在运行时更新,然后在保存时希望列表的最终内容更新为文件。
在谷歌搜索中看到的大多数解决方案中,我想出了如何使用DatagridView和数据库连接来更新DatagridView的示例。用于插入,更新和删除操作。我的答案的很多建议包括添加INotifyProperty和基于IBindingList的要求,这可能是一种过度杀伤。
我的目的只是发布我的解决方案,其中涉及使用Datagridview来更新列表。这里使用的代码片段是一个庞大的项目的一部分,在这个项目中,将数据从Datagridview更新到List并返回是一个非常大的挑战,因为数据库的初始需要被删除。
在发布这个问题时,我找到了解决问题的方法。为了解决这个问题,我从以前的各种问题中得到了一些建议。我不是在评论中寻找建议。如果有人想告诉我更好的方法来解决这个问题,请用工作代码发布答案。
答案 0 :(得分:2)
因此,阅读后,您将拥有一系列MyData对象。您希望在DataGridView中显示所有MyData对象(或子部分)。
操作员可以更改显示的值,添加一些新行或删除行。有些列可能是只读的,无法更改
按下OK按钮后,您想要从DataGridView中读取所有MyData对象并将它们保存在文件中。
您的大多数工作都可以使用表单设计器完成。
然后突然:您的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建议的项目开始。
使用以下代码:
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();
}
}
}
}
<强>学习:强>
而不是使用:
public class PersonState {
public string Name;
public string State;
}
我用过:
public class PersonState {
public string Name { get; set; }
public string State { get; set; }
}
出于某种原因,前者在尝试分配价值时不起作用。
我已经将对象列表变成了一个类变量 函数可以直接访问该列表而不是传递它 作为参数。
public List<PersonState> listOfPersonState;
我将逻辑替换为插入,更新和删除到数据库,插入 更新并删除到列表。
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);
}
注意:我直接从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;
}