如何直接在 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&lt;T&gt;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的主要内容,如果未能解决你的问题,请参考以下文章

如何检测windows窗体中的控件并对其进行编辑c#

如何使用Visual Studio 2017在Windows窗体应用程序中查看和编辑Visual Basic Power Pack形状?

如何在windows窗体里面添加窗口

vs2022窗体设计器在哪

如何在 Windows 窗体应用程序中向具有许多控件的 Panel 控件添加滚动条?

Windows 窗体应用程序中的 HTML 编辑器 [关闭]