2011-08-26 170 views
0

我想我搞砸了在我的代码的东西,它引发此异常时,电池点击指数超出范围。 DataGridView中的WinForms

“索引超出范围内的所有的时间。必须为非负值并小于集合的大小。 参数名称:索引 “

这里是我的代码

[code] 
    void dgMessages_CellClick(object sender, DataGridViewCellEventArgs e) 
     { 

      //try 
      //{ 
       // Ignore clicks that are not on button cells. 
       if (e.RowIndex < 0 || e.ColumnIndex != dgMessages.Columns["clmMessageId"].Index) return; 
       //// Retrieve the Row Index 
       string RowId = dgMessages[0, e.RowIndex].Value.ToString(); 

       //// convert string to Integer 
       int RowIndex; 
       int.TryParse(RowId, out RowIndex); 
       //Row Index calculation here 
       int RowAdj = RowIndex - 1; 
       //Retrive the Error Queue Message for that particular Row Index 
       string MesId = dgMessages.Rows[RowAdj].Cells["clmTransMessage"].Value.ToString(); 
[/code] 

这是它抛出的异常 ”串MesId = dgMessages.Rows [RowAdj] .Cells [“ clmTransMessage”] Value.ToString()。 ;”。

我从sql表填充我的datagridview。

这是我的datagridview绑定

private void tbnFillgrid_Click(object sender, EventArgs e) 
     { 
      //try 
      //{ 
//    
       dgMessages.AutoGenerateColumns = false; 


       string sql = "select * from tblOriginalmessage om left join dbo.tblTraceMessages tm on om.OriginalMessageId = tm.messageid left join tblTransformedMessage transm on om.OriginalMessageId = transm.fkOriginalMessageID "; 
       SqlConnection connection = new SqlConnection(CONNECTION_STRING); 
       //SqlDataAdapter dataadapter = new SqlDataAdapter(sql, connection); 
       dataadapter = new SqlDataAdapter(sql, connection); 
       // DataSet ds = new DataSet(); 
       ds = new DataSet(); 
       connection.Open(); 
       dataadapter.Fill(ds, scrollVal, 5, "tbltraceMessages"); 
       connection.Close(); 
       dgMessages.DataSource = ds; 
       dgMessages.DataMember = "tblTraceMessages"; 
       dgMessages.Columns["clmMessageId"].DataPropertyName = "TraceMessageId"; 
       dgMessages.Columns["clmNo"].DataPropertyName = "ID"; 
       dgMessages.Columns["clmSender"].DataPropertyName = "Sender"; 
       dgMessages.Columns["clmType"].DataPropertyName = "Type"; 
       dgMessages.Columns["clmCreated"].DataPropertyName = "Received"; 
       dgMessages.Columns["clmSaved"].DataPropertyName = "Transformed"; 
       dgMessages.Columns["clmTransMessage"].DataPropertyName = "xmlTransformedMessageContent"; 
       dgMessages.Columns["clmOriginalMessage"].DataPropertyName = "MessageBody"; 
} 

GridView

回答

1

尝试这一个:

string MesId = dgMessages.Rows[e.RowIndex].Cells["clmTransMessage"].Value.ToString() 
+1

谢谢KaeL,已经改变了我的代码,像魅力一样工作,我从其他论坛得到答案。 – Usher

+0

没问题Usher :) – KaeL

1

如果rowIndex位置= 0(即第一行),你正在服用1关闭该并使其-1绝不会有排在-1

+0

“串MesId = dgMessages.Rows [rowIndex位置] .Cells [” clmTransMessage “] Value.ToString();”。即使我也试过这个。目前我的行ID是21单击单元格的基础上。 – Usher

+0

在这种情况发生之前,您有可能已经清除了网格中的数据吗?检查dgMessages此时是否有任何数据。 – kmcc049

+0

我的意思是“string MesId = dgMessages.Rows [21] .Cells [”clmSender“]。Value.ToString(); – Usher

1

如果RowIndex为0,RowAdj将被赋值为-1。对dgMessages.Rows [-1]的调用是失败的。

+0

string MesId = dgMessages.Rows [rowindex] .Cells [“clmTransMessage”]。Value.ToString();“。即使我也试过这个。目前我的行ID是21单击单元格的基础上。 – Usher

1

在赋值之前,您可以验证特定单元格是否具有值。

if (dgMessages.Rows[RowAdj].Cells["clmTransMessage"].HasValue) 
{ 
    String MesId=dgMessages.Rows[RowAdj].Cells["clmTransMessage"].Value.ToString(); 
} 

Itz更安全的代码,以避免索引超出范围的错误。

+0

为什么我在我的代码中看不到.HasValue属性? – Usher