如何在DataTable C#中将数据从一列转换为多列?

问题描述 投票:0回答:1

我有一个项目,使用 WinForm 和 Connectivity Pack 从 WinCC 的 SQLRunTime 读取变量记录数据。读回数据时,所有实值数据都包含在 1 列中。我想根据数据的 ValueID 将这些数据分成许多不同的列。但是,当我使用命令“If ( ValueID == ) 时,数据被分为 2 列,但是从第二列开始,数据不是从第一个单元格开始填充,而是从紧接着该单元格之后的单元格开始填充包含第 1 列的数据。如何填写第二列的第一个单元格? 抱歉我的英语不是很好。 下面是描述当前情况的代码和图像 在此输入图片描述

命名空间 WinFormToSQLRunTimeWinCC { 公共部分类 UserControl1: UserControl { System.DateTime localDateTimeFrom; System.DateTime localDateTimeTo; System.DateTime univDateTimeFrom; System.DateTime univDateTimeTo; 数据表 myTableTag; 数据表 myTableTagModify; OleDbConnection myConnection; OleDbDataAdapter myDataAdapter; 字符串 mySelectQuery = "";

    public UserControl1()
    {
        InitializeComponent();
    }

    private void UserControl1_Load(object sender, EventArgs e)
    {
        dtpFrom.Value = System.DateTime.Now.AddDays(-1);
        dtpTo.Value = System.DateTime.Now;
        txtStep.Text = Convert.ToString(300);
        
    }
    public int TLG_Connect ( string mySeclectQuery)
    {
        string myConnectionString = "Provider = WinCCOLEDBProvider.1; Data Source = ADMIN\\WINCC; Catalog = CC_92_CS11__24_05_16_16_24_12R; Jet OLEDB:Database Password= ";
        myGrid.Name = "TagLogging";
        myTableTag = new DataTable();
        myTableTagModify = new DataTable();
        System.DateTime localDateTime;

        DataColumn newColumn = new DataColumn("DateTime", System.Type.GetType("System.String"));
        newColumn.Caption = "Date Time";
        newColumn.DefaultValue = string.Empty;
        myTableTagModify.Columns.Add(newColumn);
       
        newColumn = new DataColumn("kPa", System.Type.GetType("System.String"));
        newColumn.Caption = "kPa";
        newColumn.DefaultValue = string.Empty;
        myTableTagModify.Columns.Add(newColumn);
       
        newColumn = new DataColumn("Nm3/h", System.Type.GetType("System.String"));
        newColumn.Caption = "Nm3/h";
        newColumn.DefaultValue = string.Empty;
        myTableTagModify.Columns.Add(newColumn);
        using (OleDbCommand myComand = new OleDbCommand(mySeclectQuery)) 
        {
            myConnection = new OleDbConnection(myConnectionString);
            myComand.Connection = myConnection;
            myDataAdapter = new OleDbDataAdapter(myComand);
            myTableTag.TableName = "myTableTag";
            myTableTagModify.TableName = "myTableTagModify";
            myDataAdapter.Fill(myTableTag);
            myTableTagModify.Clear();
            foreach (DataRow row in myTableTag.Rows)
            {
                int a = Convert.ToInt16(row["ValueID"]);
                if ( a == 1)
                {
                    DataRow newRow = myTableTagModify.NewRow();
                    localDateTime = System.DateTime.Parse(row["Timestamp"].ToString());
                    localDateTime = localDateTime.ToLocalTime();
                    newRow["DateTime"] = localDateTime.ToString();
                    newRow["kPa"] = (String.Format("{0:F3}", row["RealValue"])).PadLeft(20);
                    myTableTagModify.Rows.Add(newRow);
                }
                if ( a ==2 )
                {
                    DataRow newRow = myTableTagModify.NewRow();
                    newRow["Nm3/h"] = (String.Format("{0:F3}", row["RealValue"])).PadLeft(20);
                    myTableTagModify.Rows.Add(newRow);
                }



            }


        }
        myGrid.DataSource = myTableTagModify;
        
        myConnection.Close();

        return (myGrid.RowCount);
    }
    public void GetData()
    {
        string timeStep = "";

        int cntData = 0;

        //covert dtpFrom to universal time (utc)
        localDateTimeFrom = dtpFrom.Value;
        localDateTimeFrom = System.DateTime.Parse(localDateTimeFrom.ToString());

        univDateTimeFrom = localDateTimeFrom.ToUniversalTime();
        string tfrom = dtpFrom.Value.Year.ToString() + "-"
                    + string.Format("{0:MM}", univDateTimeFrom.Month.ToString()) + "-"
                    + string.Format("{0:dd}", univDateTimeFrom.Day.ToString()) + " "
                    + string.Format("{0:HH}", univDateTimeFrom.Hour.ToString()) + ":"
                    + string.Format("{0:mm}", univDateTimeFrom.Minute.ToString()) + ":"
                    + string.Format("{0:ss}", univDateTimeFrom.Second.ToString());

        //covert dtpTo to universal time (utc)
        localDateTimeTo = dtpTo.Value;
        localDateTimeTo = System.DateTime.Parse(localDateTimeTo.ToString());
        univDateTimeTo = localDateTimeTo.ToUniversalTime();
        string tto = dtpTo.Value.Year.ToString() + "-"
                    + string.Format("{0:MM}", univDateTimeTo.Month.ToString()) + "-"
                    + string.Format("{0:dd}", univDateTimeTo.Day.ToString()) + " "
                    + string.Format("{0:HH}", univDateTimeTo.Hour.ToString()) + ":"
                    + string.Format("{0:mm}", univDateTimeTo.Minute.ToString()) + ":"
                    + string.Format("{0:ss}", univDateTimeTo.Second.ToString());
        timeStep = ",'TIMESTEP= " + txtStep.Text + ", 1 '";
        mySelectQuery = "TAG:R,('Process_value_archive\\LPG_kPa_1403';'Process_value_archive\\LPG_Nm3/h_1403'),'" + tfrom + "','" + tto + "'" + timeStep;
        cntData = TLG_Connect(mySelectQuery);

    }

    private void btn_Load_Click(object sender, EventArgs e)
    {
        GetData();
        
    }
}

}

c# winforms report oledb wincc
1个回答
0
投票

您每次都会添加一个新行 (

DataRow newRow = myTableTagModify.NewRow();
)。您需要为
ValueID
的每个值提供一个计数器数组,以添加新行或插入现有行之一。

© www.soinside.com 2019 - 2024. All rights reserved.