2011-07-12 53 views
1

這裏是場景:如何循環訪問數組並填充數據網格?

我有一個多行文本框,我正在閱讀每行到一個數組。然後我循環遍歷該數組,並在循環內逐個發送每個值到存儲的proc中,並獲取返回的狀態以判斷它是否有效。

問題是我相信我覆蓋了數據集變量,只填充了我檢索的最後一個值的數據網格。有沒有更好的方法來實現我想要做的事情?如果是這樣,請解釋。

protected void submitButton_Click(object sender, EventArgs e) 
    { 
     string textLines; 
     string[] textLine; 

     textLines = scannedCode.Text; 

     textLine = textLines.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries); 

     DataSet ds = null; 
     Database db = DatabaseFactory.CreateDatabase("ConnectionString"); 
     DataSet ds2 = null; 
     Database db2 = DatabaseFactory.CreateDatabase("ConnectionString"); 

     foreach (string s in textLine) 
     { 
      try 
      { 
       DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p"); 
       db2.AddInParameter(command2, "@pGuid", DbType.String, s); 
       ds2 = db2.ExecuteDataSet(command2); 
       DataGrid1.DataSource = ds2; 
       DataBind(); 

      } 

      catch (Exception ex) 
      { 

      } 
     } 



    } 
+0

這看起來就像[爲什麼我的數據網格只填充一行?](http://stackoverflow.com/questions/6668009/why-is-my-datagrid-only-populating-one-row)。你們兩個爲同一家公司工作?讀同一本書?參加同一班? :) – Tim

+1

你和SkyDawg應該一起編碼。你有非常相似的編程風格。 http://stackoverflow.com/questions/6668009/why-is-my-datagrid-only-populating-one-row –

+0

@Tim:打我吧。 :) –

回答

1

在外面創建一個DataTable並在for循環中添加返回的行。

DataTable dt = new DataTable(); 

這裏

內///...Add稱爲列環行添加到表中。在for循環綁定表之後。

protected void submitButton_Click(object sender, EventArgs e) 
    { 
     string textLines; 
     string[] textLine; 

     textLines = scannedCode.Text; 

     textLine = textLines.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries); 

     DataSet ds = null; 
     Database db = DatabaseFactory.CreateDatabase("ConnectionString"); 
     DataSet ds2 = null; 
     Database db2 = DatabaseFactory.CreateDatabase("ConnectionString"); 

     DataTable dt = new DataTable(); 
     ///...Add known columns here 
     foreach (string s in textLine) 
     { 
      try 
      { 
       DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p"); 
       db2.AddInParameter(command2, "@pGuid", DbType.String, s); 
       DataRow myNewRow = db2.ExecuteDataSet(command2).tables[0].rows[0]; 
       dt.Rows.Add(myNewRow); 

      } 

      catch (Exception ex) 
      { 

      } 
     } 


       DataGrid1.DataSource = dt; 
       DataBind(); 


    } 
+0

請您詳細說明一下嗎?我如何着手創建數據表並使用我的代碼實現它? –

+0

檢查編輯的代碼 –

1

首先,可以通過使用DataSet.Merge方法合併兩個數據集。這意味着,您應該在循環外創建一個新的DataSet,然後將其合併到由存儲過程創建的DataSet中。另一個解決方案是使用Table的ImportRow方法將行從一個DataSet複製到另一個。後一種解決方案對我來說更好。下面是一些示例代碼:

DataTable dt = new DataTable; 
... 

ds2 = db2.ExecuteDataSet(command2); 
for(int i = 0; i < ds2.Tables[0].Rows.Count; i ++) 
dt.ImportRow(ds2.Tables[0].Rows[i]); 

... 
DataGrid1.DataSource = dt; 
DataGrid1.DataBind(); 
0

嘗試這個

DataTable obj_Tb=new DataTable(); 
    obj_Tb.Columns.Add("ColumnName"); 
    . //Add Columns as your requirement 
    . 
    . 

foreach (string s in textLine) 
     { 
      try 
      { 
       DataRow objrow=obj_Tb.NewRow(); 
       DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p"); 
       db2.AddInParameter(command2, "@pGuid", DbType.String, s); 
       ds2= db2.ExecuteDataSet(command2); 
      objrow["ColumnName"]=ds2.Table[0].Rows[RowNumber]["ColumnName"].tostring(); 
       //Add Values to all columns as requirement 
       obj_Tb.Rows.Add(objrow); 

      } 

      catch (Exception ex) 
      { 

      } 
} 
       DataGrid1.DataSource = obj_Tb; 
       DataGrid1.DataBind(); 
0

其實你的問題是,你要綁定在每次迭代中,否則沒有錯碼的網格。因此,而不是:

foreach (string s in textLine) 
    { 
     try 
     { 
      DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p"); 
      db2.AddInParameter(command2, "@pGuid", DbType.String, s); 
      ds2 = db2.ExecuteDataSet(command2); 
      DataGrid1.DataSource = ds2; 
      DataBind(); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

做到這一點:

foreach (string s in textLine) 
    { 
     try 
     { 
      DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p"); 
      db2.AddInParameter(command2, "@pGuid", DbType.String, s); 
      ds2 = db2.ExecuteDataSet(command2); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    DataGrid1.DataSource = ds2; 
    DataBind(); 

但是,因爲你在做循環上相同的功能,用於優化我建議:

SqlConnection connection = new SqlConnection(ConnectionString); 
    SqlCommand command = new SqlCommand("MyStoredProcName", connection); 
    command.CommandType = CommandType.StoredProcedure; 

    SqlParameter submitParam = new SqlParameter("@pGuid", SqlDbType.String); 

    //use SqlDbType.Bit if you are returning true/false.  
    SqlParameter returParameter = new SqlParameter("@ReturnedParam", SqlDbType.String); 
    returParameter.Direction = ParameterDirection.Output; 

    connection.Open(); 

    foreach (string s in textLine) 
    { 
      returnString.Value = s;    
      command.Parameters.Clear(); 
      command.Parameters.Add(submitParam); 
      command.Parameters.Add(returParameter);   

      try 
      {     
        command.ExecuteNonQuery(); 
        store the returned string in DataTable, BindingList<string> or any, but this is how to retrieve it: 
       Convert.ToString(Command.Parameters["@ReturnedParam"].Value, CultureInfo.CurrentCulture) 
      } 
      catch (Exception ex) 
      { 
       ;; 
      } 
    } 

    connection.Close(); 

    Do the grid binding here