C#TableLayoutPanel控件导致Form开启时处于已编辑状态的问题分析

本文探讨了使用TableLayoutPanel控件时遇到的问题——Form在打开时会处于编辑状态,并带有“*”标记。分析发现这与TextBox在控件内的布局有关,特别是当单元格高度不足以容纳TextBox及其边距时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用了TableLayoutPanel控件, 好处是可以动态地调整内部的控件位置, 但有时会导致所在Form每次打开时, 都会处于已编辑状态, 如下图。

如果只是想查看Form, 每次开启后的, 看到代表编辑状态的“*”, 很不舒服。

 

测试了多种状况, 大致找到了原因:

如果在TableLayoutPanel控件中加入了TextBox, 那么该TextBox会在所在单元上下分别留3像素的空间, 如果TableLayoutPanel控件的单元高度<3+TextBox高度+3, 那么TableLayoutPanel控件会在Form开启时重新计算TextBox的位置, 导致Form文件“被编辑”。

以下是C#WinForm代码实现tableLayoutPanel控件表格的保存、查看和删除的示例代码: 1. 保存表格数据 ```csharp private void btnSave_Click(object sender, EventArgs e) { // 获取tableLayoutPanel中的控件数量 int count = tableLayoutPanel1.Controls.Count; // 创建一个用于保存表格数据的List List<string> data = new List<string>(); // 遍历tableLayoutPanel中的所有控件,将其内容添加到List中 for (int i = 0; i < count; i++) { Control control = tableLayoutPanel1.Controls[i]; if (control is TextBox) { data.Add((control as TextBox).Text); } else if (control is ComboBox) { data.Add((control as ComboBox).SelectedItem.ToString()); } // 其他控件类型的处理方式可以根据具体情况来确定 } // 将List中的数据保存为XML文件 XmlSerializer serializer = new XmlSerializer(typeof(List<string>)); using (FileStream fs = new FileStream("data.xml", FileMode.Create)) { serializer.Serialize(fs, data); } } ``` 2. 双击查看表格数据 ```csharp private void tableLayoutPanel1_CellDoubleClick(object sender, TableLayoutCellEventArgs e) { // 获取所选单元格的行和列 int row = e.Row; int col = e.Column; // 加载保存表格数据的XML文件 XmlSerializer serializer = new XmlSerializer(typeof(List<string>)); List<string> data = new List<string>(); using (FileStream fs = new FileStream("data.xml", FileMode.Open)) { data = (List<string>)serializer.Deserialize(fs); } // 根据行和列获取对应的数据 int index = row * tableLayoutPanel1.ColumnCount + col; string cellData = data[index]; // 在新窗口中显示所选单元格的数据 Form2 form2 = new Form2(cellData); form2.Show(); } ``` 3. 删除表格数据 ```csharp private void btnDelete_Click(object sender, EventArgs e) { // 获取选中的单元格 Control selectedControl = tableLayoutPanel1.GetControlFromPosition(tableLayoutPanel1.ColumnCount - 1, tableLayoutPanel1.RowCount - 1); if (selectedControl == null) { MessageBox.Show("请先选择要删除的单元格!"); return; } // 获取选中单元格的行和列 int row = tableLayoutPanel1.GetRow(selectedControl); int col = tableLayoutPanel1.GetColumn(selectedControl); // 加载保存表格数据的XML文件 XmlSerializer serializer = new XmlSerializer(typeof(List<string>)); List<string> data = new List<string>(); using (FileStream fs = new FileStream("data.xml", FileMode.Open)) { data = (List<string>)serializer.Deserialize(fs); } // 根据行和列获取对应的数据 int index = row * tableLayoutPanel1.ColumnCount + col; string cellData = data[index]; // 确认是否删除数据 DialogResult result = MessageBox.Show("确定要删除该数据吗?", "确认", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { // 从List中删除数据 data.RemoveAt(index); // 将修改后的List保存为XML文件 using (FileStream fs = new FileStream("data.xml", FileMode.Create)) { serializer.Serialize(fs, data); } // 从tableLayoutPanel中删除控件 tableLayoutPanel1.Controls.Remove(selectedControl); } } ``` 以上是C#WinForm代码实现tableLayoutPanel控件表格的保存、查看和删除的示例代码,具体实现方式可以根据自己的需求来确定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值