Reputation: 1939
I got 2 Datagridview in my form and I'm using cell validation and cell validating event handler.. in my datagridview. If i leave the cursor in the cell itself and try to open a new file through menu click..i'm getting a error message : "Argument out of exception was unhandled by usercode, index was out of range."
I know, when the cursor is in the cell, it got focus and it's in the process of cell validating that's why i'm getting this error.
This line throws the error with the message : "Argument out of exception was unhandled by usercode, index was out of range."
datagridview.Rows[e.RowIndex].ErrorText = "";
How can i avoid this error?? Or How can i remove focus during menu click to open a new file?? Thank you.
private void datagridview_CellValidating(object sender, CellValidatingEventArgs e)
{
if (e.ColumnInfo.Name == "Item1" || e.ColumnInfo.Name == "Item2")
{
datagridview.Rows[e.RowIndex].ErrorText = "";
int newInteger;
if (datagridview.Rows[e.RowIndex].IsModified)
return;
if (!int.TryParse(e.Value.ToString(),
out newInteger) || newInteger < -50000 || newInteger > 50000)
{
e.Cancel = true;
datagridview.Rows[e.RowIndex].ErrorText = "The value must be a non-negative integer";
}
}
}
private void datagridview_CellValidated(object sender, CellValidatedEventArgs e)
{
if (e.ColumnIndex != 3)
return;
int nextRowIndex = e.RowIndex + 1;
int lastRowIndex = datagridview.Rows.Count - 1;
if (nextRowIndex <= lastRowIndex)
{
var value = datagridview.Rows[e.RowIndex].Cells[3].Value.ToString();
datagridview.Rows[nextRowIndex].Cells[2].Value = value;
}
}
MenuItem Clik to open new files to the Datagridview:
private void m_test1_Click_1(object sender, EventArgs e)
{
myconfig = Myconfig.DeserializeFromXmlFile(@"test2.xml");
Display(rseConfig);
m_ConfigPages.Visible = true;
}
private void m_test2_Click(object sender, EventArgs e)
{
myconfig = Myconfig.DeserializeFromXmlFile(@"test2.xml");
Display(myconfig );
m_ConfigPages.Visible = true;
}
I'm using DataError Event Hnadler, but it's not working:
private void datagridview_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
// Don't throw an exception when we're done.
e.ThrowException = false;
// Display an error message.
string txt = "Error with " +
datagridview.Columns[e.ColumnIndex].HeaderText +
"\n\n" + e.Exception.Message;
MessageBox.Show(txt, "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
// If this is true, then the user is trapped in this cell.
e.Cancel = true;
}
Even, i have with row and col index : datagridview.Rows[e.RowIndex].Cells[e.ColumnIndex].Value
still not working.
Upvotes: 2
Views: 2805
Reputation: 8419
Try to add this event
dgv.DataError += new DataGridViewDataErrorEventHandler(dgv_DataError);
void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
//Show any message or not.. its upto you now
}
Edit :
Modify your cellvalidating event as
private void datagridview_CellValidating(object sender, CellValidatingEventArgs e)
{
try
{
int temp = Convert.ToInt32(e.Value.ToString())
if(temp < -5000 || temp > 5000)
datagridview.Rows[e.RowIndex].ErrorText = "The value must be bteewn 5000 and 5000";
}
catch
{
datagridview.Rows[e.RowIndex].ErrorText = "The value must be integer and bteewn 5000 and 5000";
}
}
Upvotes: 1