如何直接在 Windows 窗体应用程序上编辑/添加/更新 datagridview
Posted
技术标签:
【中文标题】如何直接在 Windows 窗体应用程序上编辑/添加/更新 datagridview【英文标题】:How to edit/add/update datagridview directly on Windows Forms App 【发布时间】:2019-10-02 01:06:07 【问题描述】:我正在制作一个管理酒店的 Windows 窗体应用程序。它有客户、房间、占用类。 Client 和 Rooms 有一个 ArrayList,它在运行时从 .txt 文件中填充,然后显示在 clientListView 和 roomDataGridView 中。
因此,我有这行代码来填充 roomsDGV:
roomsDGV.DataSource = roomsArrayList;
对于roomsDGV,我尝试通过单击roomsDGV 添加新行,就像它没有数据绑定时一样。我也在尝试编辑行并在编辑后或在编辑时将其保存到 txt 文件中。我可以根据需要发布更多代码,但我不确定当前显示更多代码是否会有所帮助。最后,我正在尝试一种功能,以便我可以在列表中突出显示一个客户,然后单击 roomsDGV 中的一行并将该 clientID 分配给那个房间或任何类似的方式。
加载时,datagridview 已从 arrayList 正确加载和格式化,但我似乎遇到了无法编辑 datagridview 的问题。当我单击其中一行时,它给了我这个错误:
System.IndexOutOfRangeException: 'Index -1 does not have a value.'
这源于 Application.Run(new HotelManager());
这是表格:
public partial class HotelManager : Form
// VARIABLES
string clientID;
// FILEPATHS
string clientsTxt = "Clients.txt";
string occupanciesTxt = "Occupancies.txt";
string roomsTxt = "Rooms.txt";
string clientsDat = "Clients.dat";
// ARRAYLIST FOR ROOMS and CLIENTS
ArrayList roomsArrayList = new ArrayList();
ArrayList clientsArrayList = new ArrayList();
//STACKS AND QUEUES INIT
// Load occupancies into stack > pop
Stack roomStack = new Stack();
Queue vacancyQueue = new Queue();
// RANDOM for ID
private readonly Random rand = new Random();
public HotelManager()
InitializeComponent();
private void HotelManager_Load(object sender, EventArgs e)
roomsDGV.DataSource = roomsArrayList;
// LOAD clients
// LoadClients();
RefreshClientList();
// LOAD rooms
LoadRooms();
private void NewClientButton_Click(object sender, EventArgs e)
AddClient();
private void checkInButton_Click(object sender, EventArgs e)
string clientID = clientList.SelectedItems[0].Text;
string[] text = File.ReadAllLines(occupanciesTxt);
foreach (string s in text)
if (s.Contains(clientID))
var replace = s;
Console.WriteLine(s);
replace = replace.Replace("false", "true");
File.WriteAllLines(occupanciesTxt, text);
// METHODS
private void AddClient()
//COLLECT DATA > CREATE NEW client > SHOW IN **PROGRAM/DataGridView** > add to clients file
// ID GENERATION > CHECKS AGAINST clientsTXT
clientID = rand.Next(0, 999999).ToString();
if (File.ReadLines(clientsTxt).Contains(clientID))
clientID = rand.Next(0, 999999).ToString();
Client client = new Client(clientID, firstNameBox.Text, lastNameBox.Text);
try
if (!string.IsNullOrWhiteSpace(phoneNumBox.Text))
client.PhoneNumber = Convert.ToInt64(phoneNumBox.Text);
if (!string.IsNullOrWhiteSpace(addressBox.Text))
client.Address = addressBox.Text;
catch (Exception)
MessageBox.Show("Please use the correct format!");
throw;
clientsArrayList.Add(client);
using (StreamWriter file =
new StreamWriter("Clients.txt", true))
file.WriteLine(client.ToString());
RefreshClientList();
// TEST CODE // SERIALIZATION TO .DAT
SerializeClientData(client);
private void LoadClients()
// LOADS arrayList FROM .txt FILE
List<string> clientList = File.ReadAllLines(clientsTxt).ToList();
foreach (var c in clientList)
Client client = new Client(c);
clientsArrayList.Add(client);
private void LoadRooms()
List<string> roomsList = File.ReadAllLines(roomsTxt).ToList();
foreach (var r in roomsList)
var roomDetails = r.Split('|');
if (r.Contains("BASIC"))
BasicRoom basic = new BasicRoom();
basic.RoomNumber = roomDetails[0];
basic.NumberOfBeds = Convert.ToInt32(roomDetails[1]);
basic.Balcony = Convert.ToBoolean(roomDetails[2]);
basic.DownForRepair = Convert.ToBoolean(roomDetails[3]);
basic.Smoking = Convert.ToBoolean(roomDetails[4]);
roomsArrayList.Add(basic);
else if (r.Contains("SUITE"))
Suite suite = new Suite();
suite.RoomNumber = roomDetails[0];
suite.NumberOfBeds = Convert.ToInt32(roomDetails[1]);
suite.Balcony = Convert.ToBoolean(roomDetails[2]);
suite.DownForRepair = Convert.ToBoolean(roomDetails[3]);
suite.NumberOfRooms = Convert.ToInt32(roomDetails[4]);
roomsArrayList.Add(suite);
roomStack = new Stack(roomsArrayList);
foreach (var item in roomStack)
Console.WriteLine(item);
private void RoomsDGV_CellContentClick(object sender, DataGridViewCellEventArgs e)
private void RoomsDGV_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
到目前为止,我已经浏览了所有属性,但似乎找不到合适的属性。我知道我可以添加/使用组合框等来将新项目添加到 arrayList 中,但我正在尝试使用 datagridview 功能
我希望编辑并向 DGV 添加行,但设计器中的某些东西阻止了我? 这是 DGV,单击任何行都会中断它。 https://imgur.com/a/GG7ZwdV
【问题讨论】:
数组列表几乎总是错误的选择——尤其是在这里。如果您使用List<T>
或 DataTable
您可以保留类型。带有 DataTable 和 DataAdpater 的 DGV 可以非常轻松地更新数据库。
感谢您的回复。我使用 arrayList 的原因是因为它是一个要求,但只要我使用 arrayList 来显示房间及其属性,我就可以通过不同的方式。我应该将arrayList 引用到数据表吗?如果是这样,是否会以正确的方式遍历arrayList并将其一一添加到数据表中?
信息不足,无法提供帮助。在网格中添加和编辑行/单元格非常简单。 “如何”完成通常与将数据“如何”添加到网格中有关。您需要显示创建 roomsArrayList
变量的代码,如果有单元格单击事件,那么查看它会有所帮助。这一个问题有两个许多不同的问题。提供足够的信息来重现问题或猜测是你可能得到的。
【参考方案1】:
检查一下
Insert, Update, Delete with DataGridView Control in C# (Windows Application) | A Rahim Khan's Blog
Insert, Update and Delete Records in a C# DataGridView
祝你好运
【讨论】:
第二个链接,就是使用其他控件的方法。我想知道你是否可以在本机的 datagridview 中做到这一点?我有一些布尔属性,在 DGV 上它们显示为复选标记,我希望能够通过选中或取消选中单元格来编辑行。以上是关于如何直接在 Windows 窗体应用程序上编辑/添加/更新 datagridview的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Visual Studio 2017在Windows窗体应用程序中查看和编辑Visual Basic Power Pack形状?