- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我遇到了一个我完全不知道的最奇怪的错误。我将在此处发布描述和一些代码,希望你们中的一个能给我指出正确的方向。
我的应用程序 (Winforms),允许用户将项目添加到数据 GridView (绑定(bind)到列表),每次添加项目时,列表都会序列化为 xml 文件。最初启动应用程序时,程序会检查 xml 文件,如果找到,则将之前添加的项目添加到 dgv。
我还添加了一个 DataGridViewButtonColumn 来从 dgv(列表)中删除项目。这是一些代码。
主类:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new formFoldingClient());
}
表单的构造函数调用此方法来初始设置 dgv
private void InitialDataGridViewSetup()
{
dgvClients.DataSource = null;
//adding delete button column
DataGridViewButtonColumn btnDelete = new DataGridViewButtonColumn();
btnDelete.Name = "btnDelete";
btnDelete.Text = "Delete";
btnDelete.HeaderText = "Delete";
btnDelete.UseColumnTextForButtonValue = true;
btnDelete.DefaultCellStyle.BackColor = Color.DarkBlue;
btnDelete.DefaultCellStyle.ForeColor = Color.White;
dgvClients.Columns.Add(btnDelete);
RefreshDataGridView();
}
每次添加或删除项目时,都会调用此方法刷新 dgv:
private void RefreshDataGridView()
{
dgvClients.DataSource = null;
if (clientList.Count != 0)
{
dgvClients.DataSource = clientList;
dgvClients.Show();
dgvClients.ClearSelection();
}
}
Method that gets triggered when Delete button on a row in the dgv is pressed, followed by the method the performs the delete
private void dgvClients_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0) //delete button has been clicked
{
DeleteClient(dgvClients.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].FormattedValue.ToString());
}
}
private void DeleteClient(string clientToDelete)
{
dgvGrid.DataSource = null;
int removeAt = new int();
for (int i=0; i<clientList.Count; i++)
{
if (clientList[i]._ClientName == clientToDelete)
{
removeAt = i;
break;
}
}
clientList.RemoveAt(removeAt);
LogToFile("Removed client: " + clientToDelete);
LogToBox("Removed client: " + clientToDelete);
RefreshDataGridView();
SaveConfigAsXml();
LogToFile("Changes after deletion persisted to clients.xml.");
}
我相信这是所有必要的代码。如果您还需要,请告诉我。
问题简介当应用程序首次加载时,如果它找到 xml 并将这些项目加载到列表中,一切都会按预期执行。我可以添加更多项目、删除所有项目(一次一个)等。
但是,如果我在没有初始 xml 的情况下开始,添加项目不是问题。但是当我删除 dgv 中的最后一个剩余项目时,在 Main()
Index out of range Exception: {"Index -1 does not have a value."}
堆栈跟踪
at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
at System.Windows.Forms.CurrencyManager.get_Current()
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
at System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
at System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
at System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.DataGridView.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at FoldingMonitorLocalClient.Program.Main() in C:\Users\xbonez\Documents\Visual Studio 2010\Projects\FoldingClient\FoldingClient\Program.cs:line 17
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
更多信息所以,我刚刚意识到,如果我在 dgv 中有 n 个项目,只删除第一个项目也会导致同样的异常。删除项目 2 到 n 没有问题。
读取 xml 并添加到列表的代码
private void ReadFromConfigFile()
{
LogToFile("Beginning to read from clients.xml.");
XmlSerializer deserializer = new XmlSerializer(typeof(List<Client>));
try
{
List<Client> tempClientList = new List<Client>();
using (Stream reader = new FileStream("clients.xml", FileMode.Open))
{
tempClientList = ((List<Client>)deserializer.Deserialize(reader));
}
foreach (Client client in tempClientList)
{
clientList.Add(client);
}
}
catch (FileNotFoundException ex)
{
//config file does not exist
this.LogToBox("No saved settings found.");
this.LogToFile("No existing clients.xml present.", ex);
}
catch (Exception ex)
{
LogToBox("Unable to load saved settings. Please see log for more details.");
LogToFile("Failed to read clients.xml.", ex);
}
finally
{
LogToFile("Finished reading clients.xml.");
}
}
点击添加按钮时的代码
private void btnAdd_Click(object sender, EventArgs e)
{
this.tbxClientName.BackColor = Color.White;
this.tbxLogLoc.BackColor = Color.White;
bool exists = false;
foreach (Client client in clientList)
{
if (client._ClientName == this.tbxClientName.Text)
exists = true;
}
if (String.IsNullOrEmpty(tbxClientName.Text))
{
this.tbxClientName.BackColor = Color.Yellow;
LogToBox("Enter Client Name");
LogToFile("user attempted to add client without specifying client name.");
}
else if (String.IsNullOrEmpty(tbxLogLoc.Text))
{
this.tbxLogLoc.BackColor = Color.Yellow;
LogToBox("Select WorkLog location.");
LogToFile("User attempted to add client without specifying worklog location.");
}
else if (exists)
{
//client name entered by user already exists
LogToBox("Client name " + this.tbxClientName.Text + " already exists. Enter another Client name.");
LogToFile("Duplicate client name entered.");
this.tbxClientName.BackColor = Color.Yellow;
}
else
{
//everything is valid. Add new client to list
clientList.Add(new Client(tbxClientName.Text, tbxLogLoc.Text));
LogToBox("Added new client: " + tbxClientName.Text + ".");
LogToFile("Added new client: " + tbxClientName.Text + ".");
this.tbxClientName.Text = String.Empty;
this.tbxLogLoc.Text = String.Empty;
RefreshDataGridView();
SaveConfigAsXml();
}
}
最佳答案
这似乎是 .NET 中的某种内部绑定(bind)错误。每当使用绑定(bind)到列表的 DataGridView 时,我都会遇到完全相同的异常。我真的花了很多时间来寻找解决方案,今天我终于设法摆脱了这些异常 - 通过将 ICurrencyManagerProvider 接口(interface)添加到我的所有列表。该接口(interface)只有一个“CurrencyManager”只读属性和一个“GetRelatedCurrencyManager”方法。我只是在它们两个中返回 Nothing,仅此而已,不再有 CurrencyManager“索引 -1 没有值”的东西。
EDIT: OK, just found out the "proper way" is actually to use BindingList(of T) class instead of List(of T)
关于c# - Index-1 没有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4965963/
这个问题已经有答案了: 已关闭14 年前。 ** 重复:What's the difference between X = X++; vs X++;? ** 所以,即使我知道你永远不会在代码中真正做到
我在一本C语言的书上找到了这个例子。此代码转换输入数字基数并将其存储在数组中。 #include int main(void) { const char base_digits[16] =
尝试使用“pdf_dart”库保存 pdf 时遇到问题。 我认为问题与我从互联网下载以尝试附加到 pdf 的图像有关,但我不确定它是什么。 代码 import 'dart:io'; import 'p
我的 Apache 服务器曾经可以正常工作,但它随机开始对几乎每个目录发出 403 错误。两个目录仍然有效,我怎样才能使/srv/www/htdocs 中的所有目录正常工作? 我查看了两个可用目录的权
这些索引到 PHP 数组的方法之间有什么区别(如果有的话): $array[$index] $array["$index"] $array["{$index}"] 我对性能和功能上的差异都感兴趣。 更
我有一个简单的结构,我想为其实现 Index,但作为 Rust 的新手,我在借用检查器方面遇到了很多麻烦。我的结构非常简单,我想让它存储一个开始值和步长值,然后当被 usize 索引时它应该返回 st
我对 MarkLogic 中的 element-range-index 和 field-range-index 感到困惑。 请借助示例来解释差异。 最佳答案 这两个都是标量索引:特定类型的基于值的排序
我对 MarkLogic 中的 element-range-index 和 field-range-index 感到困惑。 请借助示例来解释差异。 最佳答案 这两个都是标量索引:特定类型的基于值的排序
所以我有一个 df,我在其中提取一个值以将其存储在另一个 df 中: import pandas as pd # Create data set d = {'foo':[100, 111, 222],
我有一个由 codeigniter 编写的网站,我已经通过 htaccess 从地址中删除了 index.php RewriteCond $1 !^(index\.php|resources|robo
谁能告诉我这两者有什么区别: ALTER TABLE x1 ADD INDEX(a); ALTER TABLE x1 ADD INDEX(b); 和 ALTER TABLE x1 ADD INDEX(
我在 Firefox 和其他浏览器上遇到嵌套 z-index 的问题,我有一个 div,z-index 为 30000,位于 label 下方> zindex 为 9000。我认为这是由 z-inde
Link to the function image编写了一个函数来查找中枢元素(起始/最低)的索引 排序和旋转数组。我解决了这个问题并正在检查 边缘情况,它甚至适用于索引为零的情况。任何人都可以 解
我正在尝试运行有关成人人口普查数据的示例代码。当我运行这段代码时: X_train, X_test, y_train, y_test = cross_validation.train_test_spl
我最近将我的 index.html 更改为 index.php - 我希望能够进行重定向以反射(reflect)这一点,然后还进行重写以强制 foo.com/index.php 成为 foo.com/
我最近将我的 index.html 更改为 index.php - 我希望能够进行重定向以反射(reflect)这一点,然后还进行重写以强制 foo.com/index.php 成为 foo.com/
我有一个用户定义的函数,如下所示:- def genre(option,option_type,*limit): option_based = rank_data.loc[rank_data[
我有两个巨大的数据框我正在合并它们,但我不想有重复的列,因此我通过减去它们来选择列: cols_to_use=df_fin.columns-df_peers.columns.difference(['
感谢您从现在开始的回答, 我是React Native的新手,我想做一个跨平台的应用所以我创建了index.js: import React from 'react'; import { Co
我知道 not_analyzed 是什么意思。简而言之,该字段不会被指定的分析器标记化。 然而,什么是 NO_NORMS 方法?我看到了文档,但请用简单的英语解释我。什么是索引时间字段和文档提升和字段
我是一名优秀的程序员,十分优秀!