遇到一个非常奇怪的报错,查了一天没有结果,换了几个方式,还是有相同的报错.
检查后发现代码报错的位置column.Name ,只是在FLosQty和FPorportion字段时才会有报错,出现报错点确定后,程序又能正常执行.
public void NewDataViewCellsName(string username, int tableid)//自动识别字段别名
{
//SetDataGridView.RowStateChanged -= dgv_RowStateChanged;
string name_str = null;
try
{ //取字段数据表的资料
SetSqlText = "select FColumnName,FColumnText,FColumnWidth,FType,FBit,FLook,FUserLook from t_jc_ColumnsVisible where FUserName like '" +
username + "' and FFormID=" + tableid;
datacommd = new SqlCommand(SetSqlText, SetGetSqlConnection); sda = new SqlDataAdapter(datacommd);
ds = new DataSet();
sda.Fill(ds);
if (ds.Tables[0].Rows.Count == 0)
{
return;
}
//遍历DATAGRIDVIEW并设置别名与宽度
//Console.WriteLine("{0}={1}", ds.Tables[0].Rows.Count.ToString(), SetDataGridView.Columns.Count.ToString());
foreach (DataGridViewColumn column in SetDataGridView.Columns)
{
#region 以下代码在天瑞物料使用记录表时,出现莫名的报错:索引超出范围
//从DATASET表中取出匹配的记录
//Console.WriteLine("Tabler字段名{0},DataGridView字段名{1}", Convert.ToInt32(dr["FLook"]).ToString(), column.Name.ToString());
//name_str = column.Name.ToString();
//DataRow dr = ds.Tables[0].Select().SingleOrDefault(s => s["FColumnName"].ToString().Trim() == column.Name.ToString().Trim()); ////Console.WriteLine("Tabler字段名{0},DataGridView字段名{1}", Convert.ToInt32(dr["FLook"]).ToString(), column.Name.ToString());
////name_str = dr["FColumnText"].ToString();
////首列不能为空
//column.HeaderText = dr["FColumnText"].ToString();
//column.Width = Convert.ToInt32(dr["FColumnWidth"]);
//if (Convert.ToInt32(dr["FLook"]) == 0)
//{
// column.Visible = false;
//}
//else if (Convert.ToInt32(dr["FUserLook"]) == 0)
//{
// column.Visible = false;
//}
//else if (Convert.ToInt32(dr["FColumnWidth"]) == 0)
//{
// column.Visible = false;
//}
//else
//{
// column.Visible = true;
// //格式化数字格式
// DataGridViewCellStyle cs = new DataGridViewCellStyle();
// cs.Format = "N" + dr["FBit"].ToString();
// if (column.ValueType == typeof(System.Decimal))
// {
// column.DefaultCellStyle = cs;
// } //}
#endregion
#region 2017-11-13因为上面的报错,改成linq语句查询数据
var query =
from q in ds.Tables[0].AsEnumerable()
where q.Field<string>("FColumnName") == column.Name
select q;
if (query.Count() > 0)
{ foreach (var item in query)
{
name_str = column.Name; //Console.WriteLine(column.Index);
column.HeaderText = item.Field<string>("FColumnText").ToString();
column.Width = Convert.ToInt32(item.Field<decimal>("FColumnWidth")); if (Convert.ToInt32(item.Field<bool>("FLook")) == 0)
{
column.Visible = false;
}
else if (Convert.ToInt32(item.Field<bool>("FUserLook")) == 0)
{
column.Visible = false;
}
else if (Convert.ToDecimal(item.Field<decimal>("FColumnWidth")) == 0M)
{
column.Visible = false;
}
else
{
column.Visible = true;
} DataGridViewCellStyle cs = new DataGridViewCellStyle();
cs.Format = "N" + item.Field<int>("FBit");
if (column.ValueType == typeof(System.Decimal))
{
column.DefaultCellStyle = cs;
}
}
}
#endregion } }
catch (Exception es)
{ MessageBox.Show(name_str + "\r" + es.Message, "设置表格时出错", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
finally
{
////CellFormat("N0");
//SetDataGridView.RowStateChanged += dgv_RowStateChanged;
////指定首列宽度
//SetDataGridView.RowHeadersWidth = 60;
}
}


检查后发现代码报错的位置column.Name ,只是在FLosQty和FPorportion字段时才会有报错,出现报错点确定后,程序又能正常执行.
public void NewDataViewCellsName(string username, int tableid)//自动识别字段别名
{
//SetDataGridView.RowStateChanged -= dgv_RowStateChanged;
string name_str = null;
try
{ //取字段数据表的资料
SetSqlText = "select FColumnName,FColumnText,FColumnWidth,FType,FBit,FLook,FUserLook from t_jc_ColumnsVisible where FUserName like '" +
username + "' and FFormID=" + tableid;
datacommd = new SqlCommand(SetSqlText, SetGetSqlConnection); sda = new SqlDataAdapter(datacommd);
ds = new DataSet();
sda.Fill(ds);
if (ds.Tables[0].Rows.Count == 0)
{
return;
}
//遍历DATAGRIDVIEW并设置别名与宽度
//Console.WriteLine("{0}={1}", ds.Tables[0].Rows.Count.ToString(), SetDataGridView.Columns.Count.ToString());
foreach (DataGridViewColumn column in SetDataGridView.Columns)
{
#region 以下代码在天瑞物料使用记录表时,出现莫名的报错:索引超出范围
//从DATASET表中取出匹配的记录
//Console.WriteLine("Tabler字段名{0},DataGridView字段名{1}", Convert.ToInt32(dr["FLook"]).ToString(), column.Name.ToString());
//name_str = column.Name.ToString();
//DataRow dr = ds.Tables[0].Select().SingleOrDefault(s => s["FColumnName"].ToString().Trim() == column.Name.ToString().Trim()); ////Console.WriteLine("Tabler字段名{0},DataGridView字段名{1}", Convert.ToInt32(dr["FLook"]).ToString(), column.Name.ToString());
////name_str = dr["FColumnText"].ToString();
////首列不能为空
//column.HeaderText = dr["FColumnText"].ToString();
//column.Width = Convert.ToInt32(dr["FColumnWidth"]);
//if (Convert.ToInt32(dr["FLook"]) == 0)
//{
// column.Visible = false;
//}
//else if (Convert.ToInt32(dr["FUserLook"]) == 0)
//{
// column.Visible = false;
//}
//else if (Convert.ToInt32(dr["FColumnWidth"]) == 0)
//{
// column.Visible = false;
//}
//else
//{
// column.Visible = true;
// //格式化数字格式
// DataGridViewCellStyle cs = new DataGridViewCellStyle();
// cs.Format = "N" + dr["FBit"].ToString();
// if (column.ValueType == typeof(System.Decimal))
// {
// column.DefaultCellStyle = cs;
// } //}
#endregion
#region 2017-11-13因为上面的报错,改成linq语句查询数据
var query =
from q in ds.Tables[0].AsEnumerable()
where q.Field<string>("FColumnName") == column.Name
select q;
if (query.Count() > 0)
{ foreach (var item in query)
{
name_str = column.Name; //Console.WriteLine(column.Index);
column.HeaderText = item.Field<string>("FColumnText").ToString();
column.Width = Convert.ToInt32(item.Field<decimal>("FColumnWidth")); if (Convert.ToInt32(item.Field<bool>("FLook")) == 0)
{
column.Visible = false;
}
else if (Convert.ToInt32(item.Field<bool>("FUserLook")) == 0)
{
column.Visible = false;
}
else if (Convert.ToDecimal(item.Field<decimal>("FColumnWidth")) == 0M)
{
column.Visible = false;
}
else
{
column.Visible = true;
} DataGridViewCellStyle cs = new DataGridViewCellStyle();
cs.Format = "N" + item.Field<int>("FBit");
if (column.ValueType == typeof(System.Decimal))
{
column.DefaultCellStyle = cs;
}
}
}
#endregion } }
catch (Exception es)
{ MessageBox.Show(name_str + "\r" + es.Message, "设置表格时出错", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
finally
{
////CellFormat("N0");
//SetDataGridView.RowStateChanged += dgv_RowStateChanged;
////指定首列宽度
//SetDataGridView.RowHeadersWidth = 60;
}
}

