1

我正在尝试将行添加到数据网格,其中传递条件以查询数据并获取从该查询返回的结果以添加到数据网格。下面是代码:

private void FetchAllJobStatus(int regionID)
    {
        OleDbConnection con = new OleDbConnection(Constring);
        String strQu1;
        strQu1 = "SELECT LOGPATH, TWSID FROM JOB_DETAILS_TEST WHERE REGIONID = " + regionID + " ORDER BY TWSID";
        OleDbDataAdapter dapt1 = new OleDbDataAdapter(strQu1, con);
        DataTable dt1 = new DataTable();
        dapt1.Fill(dt1);

        foreach (DataRow row in dt1.Rows)
        {
            string twsIDName = row.ItemArray[1].ToString();
            string startTime = GetStartTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
            string endTime = GetEndTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
            DateTime dat1 = DateTime.Parse(startTime);
            DateTime dat2 = DateTime.Parse(endTime);
            string endingTime;

            if (endTime == string.Empty || endTime == null || dat2 < dat1)
            {
                endingTime = "";
            }
            else
            {
                endingTime = endTime.Remove(0, 3).ToString();
            }
            string startingTime = startTime.Remove(0, 3).ToString();
            String strQu2;
            strQu2 = "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID + " ORDER BY JOBNAME";
            OleDbDataAdapter dapt2 = new OleDbDataAdapter(strQu2, con);
            DataSet ds = new DataSet();
            dapt2.Fill(ds, "dt2");
            dgJobStatusAll.AutoGenerateColumns = true;
            dgJobStatusAll.DataSource = ds;
            dgJobStatusAll.DataMember = "dt2";
        }

    }

这里只有最后一个数据被附加到网格中。提前致谢

4

3 回答 3

0

你可以用DataTable.Merge(). 在循环之前取 aDataTable而不是DataSet ds并在for循环之后绑定网格:

 ............................................
 ................................................
        DataTable dt1 = new DataTable();
        dapt1.Fill(dt1);
   DataTable dtMain=new DataTable();

 foreach (DataRow row in dt1.Rows)
    {
        string twsIDName = row.ItemArray[1].ToString();
        string startTime = GetStartTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        string endTime = GetEndTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        DateTime dat1 = DateTime.Parse(startTime);
        DateTime dat2 = DateTime.Parse(endTime);
        string endingTime;

        if (endTime == string.Empty || endTime == null || dat2 < dat1)
        {
            endingTime = "";
        }
        else
        {
            endingTime = endTime.Remove(0, 3).ToString();
        }
        string startingTime = startTime.Remove(0, 3).ToString();
        String strQu2;
        strQu2 = "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID + " ORDER BY JOBNAME";
        OleDbDataAdapter dapt2 = new OleDbDataAdapter(strQu2, con);
        DataTable dtTemp=new 
        dapt2.Fill(dtTemp);

       if(dtTemp.Rows.Count>0)
       {
          dtMain.Merge(dtTemp);
       }
    }
        dgJobStatusAll.AutoGenerateColumns = true;
        dgJobStatusAll.DataSource = dtTemp;
        //dgJobStatusAll.DataMember = "dt2";

}

或者您可以使用内部连接编写单个查询,这将是最好的情况。

于 2013-12-06T06:23:06.683 回答
0

使用联合编写单个查询并在循环之外填充数据表。拿

String strQu2; 

在循环之外。在循环中使用

if(string.IsNullOrEmpty(strQu2 ))
{
strQu2 ="SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID ;
}
else
{
strQu2 =strQu2 +" Union All "+ "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID ;
}

现在在循环之后写

strQu2 =strQu2 + " Order by REGIONID,JOBNAME "

并填充数据表并绑定到网格

于 2013-12-06T06:17:15.557 回答
0

您的发现很明显,因为您每次都在 foreach 内绑定网格,因此每次都会被覆盖。尝试这样做。这还不完整,但应该让你走上正轨。

private void FetchAllJobStatus(int regionID)
{
    OleDbConnection con = new OleDbConnection(Constring);
    String strQu1;
    strQu1 = "SELECT LOGPATH, TWSID FROM JOB_DETAILS_TEST WHERE REGIONID = " + regionID + " ORDER BY TWSID";
    OleDbDataAdapter dapt1 = new OleDbDataAdapter(strQu1, con);
    DataTable dt1 = new DataTable();
    dapt1.Fill(dt1);

    DataSet ds = new DataSet(); // Move this out
    DataTable dt = new DataTable("MyTable"); 
    dt.Columns.Add(new DataColumn("yourColumnName",typeof(int))); // Create columns as you want (your structure)
    dt.Columns.Add(new DataColumn("yourColumnName2", typeof(string)));
    foreach (DataRow row in dt1.Rows)  // Now inside foreach create row and add it to  the table
    {
        string twsIDName = row.ItemArray[1].ToString();
        string startTime = GetStartTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        string endTime = GetEndTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        DateTime dat1 = DateTime.Parse(startTime);
        DateTime dat2 = DateTime.Parse(endTime);
        string endingTime;

        if (endTime == string.Empty || endTime == null || dat2 < dat1)
        {
            endingTime = "";
        }
        else
        {
            endingTime = endTime.Remove(0, 3).ToString();
        }
        string startingTime = startTime.Remove(0, 3).ToString();
        String strQu2;
        strQu2 = "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID + " ORDER BY JOBNAME";
        OleDbDataAdapter dapt2 = new OleDbDataAdapter(strQu2, con);
        // dapt2.Fill(ds, "dt2");
        DataRow dr = dt.NewRow(); // create row
        dr["yourColumnName"] = // fill these
        dr["yourColumnName2"] = // fill these
        dt.Rows.Add(dr); // add row to dt
    }
    ds.Tables.Add(dt); // add table to your dataset
    dgJobStatusAll.AutoGenerateColumns = true;
    dgJobStatusAll.DataSource = ds;
    dgJobStatusAll.DataMember = "dt2";

}
于 2013-12-06T06:20:09.203 回答