예제 #1
0
        /// <summary>
        /// Refresh the chart from data in the specified soil.
        /// </summary>
        public void Populate(Soil Soil, string ChartType, bool ShowSW = false)
        {
            DataTable Table = new DataTable();

            if (ChartType == "Water")
            {
                DataTableUtility.AddColumn(Table, "DepthMidPoints (mm)", Soil.ToMidPoints(Soil.Water.Thickness));
                DataTableUtility.AddColumn(Table, "Airdry (mm/mm)", Soil.Water.AirDry);
                DataTableUtility.AddColumn(Table, "LL15 (mm/mm)", Soil.Water.LL15);
                DataTableUtility.AddColumn(Table, "DUL (mm/mm)", Soil.Water.DUL);
                DataTableUtility.AddColumn(Table, "SAT (mm/mm)", Soil.Water.SAT);

                if (ShowSW)
                {
                    DataTableUtility.AddColumn(Table, "SW (mm/mm)", Soil.SW);
                }

                foreach (string CropName in Soil.CropNames)
                {
                    double[] PAWCmm      = MathUtility.Multiply(Soil.PAWCCrop(CropName), Soil.Thickness);
                    string   LegendTitle = CropName + " LL (PAWC: " + MathUtility.Sum(PAWCmm).ToString("f0") + "mm)";
                    DataTableUtility.AddColumn(Table, LegendTitle, Soil.Crop(CropName).LL);
                }
            }
            else if (ChartType == "SoilOrganicMatter")
            {
                DataTableUtility.AddColumn(Table, "DepthMidPoints (mm)", Soil.ToMidPoints(Soil.SoilOrganicMatter.Thickness));
                DataTableUtility.AddColumn(Table, "InertC (kg/ha)", Soil.SoilOrganicMatter.InertC(Soil));
                DataTableUtility.AddColumn(Table, "BiomC (kg/ha)", Soil.SoilOrganicMatter.BiomC(Soil));
                DataTableUtility.AddColumn(Table, "HumC (kg/ha)", Soil.SoilOrganicMatter.HumC(Soil));
            }
            Populate(Table, ChartType, Soil);
        }
예제 #2
0
 /// <summary>
 /// Set a column of string values in the specified table.
 /// </summary>
 private static void SetStringValues(DataTable Table, string ColumnName, string[] Values, int StartRow)
 {
     if (MathUtility.ValuesInArray(Values))
     {
         DataTableUtility.AddColumn(Table, ColumnName, Values, StartRow, Values.Length);
     }
     else if (!Table.Columns.Contains(ColumnName))
     {
         Table.Columns.Add(ColumnName, typeof(string));
     }
 }
예제 #3
0
        /// <summary>
        /// We need to trap the end of an edit and write the data back to the
        /// table.
        /// </summary>
        protected override void OnCellValueChanged(DataGridViewCellEventArgs e)
        {
            base.OnCellValueChanged(e);
            if (DataSourceTable != null && !InRefresh && e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                try
                {
                    int Col = e.ColumnIndex;
                    int Row = e.RowIndex;

                    if (Row > DataSourceTable.Rows.Count - 1)
                    {
                        DataSourceTable.Rows.Add(DataSourceTable.NewRow());
                    }

                    // Make sure this row has our popup menu.
                    if (Rows[e.RowIndex].ContextMenuStrip == null)
                    {
                        Rows[e.RowIndex].ContextMenuStrip = PopupMenu;
                    }
                    ContextMenuStrip = PopupMenu;

                    if (DataSourceTable.Columns[Col].DataType == typeof(double) &&
                        !MathUtility.IsNumerical(Rows[Row].Cells[Col].Value.ToString()))
                    {
                        // Turn the column into a string column.

                        // Capture state of existing column and remove it from DataTable.
                        string   ColumnName = DataSourceTable.Columns[Col].ColumnName;
                        string[] Values     = GridUtility.GetColumnAsStringsUsingCellFormat(this, Col);
                        int      Ordinal    = DataSourceTable.Columns[Col].Ordinal;
                        DataSourceTable.Columns.RemoveAt(Col);

                        // Create a new column of string type.
                        DataColumn NewColumn = DataSourceTable.Columns.Add(ColumnName, typeof(string));
                        NewColumn.SetOrdinal(Ordinal);
                        DataTableUtility.AddColumn(DataSourceTable, ColumnName, Values);
                    }
                    DataSourceTable.Rows[Row][Col] = Rows[Row].Cells[Col].Value;
                    ChangedColumnNames.Add(DataSourceTable.Columns[Col].ColumnName);

                    if (TableColumnChangedEvent != null)
                    {
                        TableColumnChangedEvent.Invoke(ChangedColumnNames);
                    }
                    ChangedColumnNames.Clear();
                }
                catch (Exception)
                { }  // This can happen when the user puts a text value into a numeric column.
            }
        }
예제 #4
0
        /// <summary>
        /// Populate the graph.
        /// </summary>
        private void PopulateGraph()
        {
            DataTable Table = new DataTable();

            Table.TableName = "InitWater";
            DataTableUtility.AddColumn(Table, "DepthMidPoints (mm)", Soil.ToMidPoints(Soil.Water.Thickness));
            DataTableUtility.AddColumn(Table, "SW (mm/mm)", Soil.SWAtWaterThickness);
            DataTableUtility.AddColumn(Table, "AirDry (mm/mm)", Soil.Water.AirDry);
            DataTableUtility.AddColumn(Table, "LL15 (mm/mm)", Soil.Water.LL15);
            DataTableUtility.AddColumn(Table, "DUL (mm/mm)", Soil.Water.DUL);
            DataTableUtility.AddColumn(Table, "SAT (mm/mm)", Soil.Water.SAT);

            SoilGraph.AddDataSource(Table);
            SoilGraph.Populate(Table, "InitWater", Soil);
        }
예제 #5
0
 private static void AddCropColumn(DataTable Data, string CropName, Soil MySoil, int Row, int NumLayers)
 {
     if (MySoil.CropExists(CropName))
     {
         DataTableUtility.AddColumn(Data, "ll(" + CropName + ")", MySoil.LL(CropName), Row, NumLayers);
         DataTableUtility.AddColumn(Data, "kl(" + CropName + ")", MySoil.KL(CropName), Row, NumLayers);
         DataTableUtility.AddColumn(Data, "xf(" + CropName + ")", MySoil.XF(CropName), Row, NumLayers);
     }
     else
     {
         DataTableUtility.AddValue(Data, "ll(" + CropName + ")", MathUtility.MissingValue, Row, NumLayers);
         DataTableUtility.AddValue(Data, "kl(" + CropName + ")", MathUtility.MissingValue, Row, NumLayers);
         DataTableUtility.AddValue(Data, "xf(" + CropName + ")", MathUtility.MissingValue, Row, NumLayers);
     }
 }
예제 #6
0
        /// <summary>
        /// Create and fill a datatable from the grid.
        /// </summary>
        /// <returns></returns>
        public DataTable ToTable()
        {
            DataTable Table = new DataTable();

            for (int Col = 0; Col < Columns.Count; Col++)
            {
                string   ColumnName = Columns[Col].HeaderText.Replace("\r\n", " ");
                string[] Values     = GridUtility.GetColumnAsStrings(this, Col);
                if (MathUtility.IsNumerical(Values))
                {
                    DataTableUtility.AddColumn(Table, ColumnName, MathUtility.StringsToDoubles(Values));
                }
                else
                {
                    DataTableUtility.AddColumn(Table, ColumnName, Values);
                }
            }

            return(Table);
        }
예제 #7
0
        public void ConvertDataTableToSoil()
        {
            double NaN = double.NaN;


            DataTable Table = new DataTable();

            DataTableUtility.AddColumn(Table, "Name", new string[] { "soil1", "soil1", "soil1", "soil1", "soil2", "soil2", "soil2", "soil2", "soil2", "soil2" });
            DataTableUtility.AddColumn(Table, "Country", new string[] { "Aust", "Aust", "Aust", "Aust", "NZ", "NZ", "NZ", "NZ", "NZ", "NZ" });
            DataTableUtility.AddColumn(Table, "Thickness (mm)", new double[] { 150.00, 150.00, 300.00, NaN, 50.00, 50.00, 150.00, 300.00, 300.00, 300.00 });
            DataTableUtility.AddColumn(Table, "BD (g/cc)", new double[] { 1.02, 1.03, 1.02, NaN, 1.06, 1.02, 1.03, 1.02, 1.02, 1.06 });
            DataTableUtility.AddColumn(Table, "BDCode", new string[] { "FM", "LM", "C_grav", "E", "", "", "", "", "", "" });

            DataTableUtility.AddColumn(Table, "ThicknessChem (mm)", new double[] { 150.00, 150.00, 300.00, 300.00, 50.00, 50.00, 150.00, 300.00, 300.00, 300.00 });
            DataTableUtility.AddColumn(Table, "OC", new double[] { 0.25, 1.20, 1.60, 1.80, 0.10, 0.20, 0.30, 0.40, 0.50, 00.60 });
            DataTableUtility.AddColumn(Table, "OCCode", new string[] { "M (Walkley Black %)", "E (Walkley Black %)", "E (Walkley Black %)", "E (Walkley Black %)", "", "", "", "", "", "" });

            DataTableUtility.AddColumn(Table, "AirDry (mm/mm)", new double[] { 0.15, 0.26, 0.29, 0.29, 0.30, 0.15, 0.26, 0.29, 0.29, 0.30 });
            DataTableUtility.AddColumn(Table, "Wheat LL (mm/mm)", new double[] { 0.29, 0.25, 0.24, 0.23, 0.22, 0.29, 0.25, 0.24, 0.23, 0.22 });
            DataTableUtility.AddColumn(Table, "Wheat KL (/day)", new double[] { 0.10, 0.08, 0.06, 0.04, 0.02, 0.10, 0.08, 0.06, 0.04, 0.02 });
            DataTableUtility.AddColumn(Table, "Wheat XF (0-1)", new double[] { 1.00, 0.80, 0.80, 0.60, 0.60, 1.00, 0.80, 0.80, 0.60, 0.60 });
            DataTableUtility.AddColumn(Table, "Barley LL (mm/mm)", new double[] { 0.25, 0.24, 0.23, 0.22, 0.21, 0.25, 0.24, 0.23, 0.22, 0.21 });

            Soil[] Soils = SoilDataTable.TableToSoils(Table);

            Assert.AreEqual(Soils.Length, 2);
            Assert.AreEqual(Soils[0].Name, "soil1");
            Assert.AreEqual(Soils[1].Name, "soil2");
            Assert.AreEqual(Soils[0].Water.BD, new double[] { 1.02, 1.03, 1.02 }, 0.01);

            Assert.IsTrue(MathUtility.AreEqual(Soils[0].Water.BDMetadata,
                                               new string[] { "Field measured and checked for sensibility",
                                                              "Laboratory measured",
                                                              "Calculated from gravimetric moisture when profile wet but drained" }));

            Assert.AreEqual(Soils[1].Water.BD, new double[] { 1.06, 1.02, 1.03, 1.02, 1.02, 1.06 }, 0.01);
            Assert.AreEqual(Soils[0].SoilOrganicMatter.OC, new double[] { 0.25, 1.20, 1.60, 1.80 });
            Assert.AreEqual(Soils[0].Crop("wheat").LL, new double[] { 0.29, 0.25, 0.24 });
            Assert.AreEqual(Soils[0].Crop("wheat").KL, new double[] { 0.10, 0.08, 0.06 });
        }
예제 #8
0
        public DataTable CreateTable(ApsimFile.Component childComp)
        {
            DataTable Table = new DataTable();


            XmlNodeList uiNodes   = childComp.ContentsAsXML.SelectNodes("//ui/* | //CustomUI/*");
            bool        isManager = true;

            if (uiNodes.Count == 0)
            {
                uiNodes   = childComp.ContentsAsXML.ChildNodes;
                isManager = false;
            }

            bool useSingleColumnTable = uiNodes.Count == 1 || childComp.Type == "siloinput";

            if (useSingleColumnTable)
            {
                csvLabel.Visible = false;

                XmlNodeList foundNodes = Data.SelectNodes("//vars/" + uiNodes[0].Name);
                string[]    values     = null;
                if (foundNodes.Count == 1)
                {
                    values = foundNodes[0].InnerText.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                }
                else
                {
                    values = new string[0];
                }
                DataTableUtility.AddColumn(Table, uiNodes[0].Name, values);
                // If there is only 1 variable, then turn the table into lots of rows so that the user can
                // enter one value per row rather than all on one line csv style.
                for (int i = 0; i < 10000; i++)
                {
                    Table.Rows.Add(Table.NewRow());
                }
            }
            else
            {
                csvLabel.Visible = true;
                Table.Columns.Add(" ", typeof(System.Boolean));
                Table.Columns.Add("names", typeof(string));
                Table.Columns.Add("Variables", typeof(string));
                Table.Columns.Add("Parameters", typeof(string));
                foreach (XmlNode ui in uiNodes)
                {
                    DataRow newRow = Table.NewRow();
                    newRow[0] = false;

                    string varName = "";
                    string text    = "";
                    if (isManager)
                    {
                        varName = ui.Name;
                        if (ui.Attributes["description"] != null)
                        {
                            text = ui.Attributes["description"].Value;
                        }
                        else
                        {
                            text = varName;
                        }
                    }
                    else
                    {
                        varName = XmlHelper.Name(ui);
                    }
                    newRow[1] = varName;
                    newRow[2] = text;
                    newRow[3] = ui.InnerText;

                    //look for corresponding node in the variables node
                    if (varName != "#comment")
                    {
                        XmlNodeList foundNodes = Data.SelectNodes("//vars/" + varName);
                        if (foundNodes.Count == 1)
                        {
                            XmlNode varNode = foundNodes[0];
                            if (varNode != null)
                            {
                                newRow[0] = true;
                                newRow[3] = varNode.InnerText;
                            }
                        }
                        Table.Rows.Add(newRow);
                    }
                }
            }



            return(Table);
        }
예제 #9
0
        /// <summary>
        /// Refresh the chart from data in the specified datasource.
        /// </summary>
        public void Populate(DataTable DataSource, string ChartType, Soil Soil)
        {
            this.Soil  = Soil;
            this.Table = DataSource;

            DataSource.TableName        = ChartType;
            Chart.Axes.Left.Automatic   = true;
            Chart.Axes.Top.Automatic    = true;
            Chart.Axes.Right.Automatic  = true;
            Chart.Axes.Bottom.Automatic = true;
            //Chart.Series.Clear();

            // Try and load an appropriate template.
            if (Directory.Exists(Path.Combine(Configuration.ApsimDirectory(), "UserInterface")))
            {
                FileName = Path.Combine(Configuration.ApsimDirectory(), "UserInterface", ChartType + ".xml");
            }
            else
            {
                FileName = Path.Combine(Configuration.ApsimDirectory(), ChartType + ".xml");
            }
            XmlDocument Doc = new XmlDocument();

            if (File.Exists(FileName))
            {
                Doc.Load(FileName);
                Data = Doc.DocumentElement;
            }
            else
            {
                Data = null;
            }

            // Get the base chart to do it's thing.
            base.OnRefresh();

            // Make sure there is a DepthMidPoints column
            if (DataSource.Columns.IndexOf("DepthMidPoints (mm)") == -1)
            {
                try
                {
                    string[] Depths         = DataTableUtility.GetColumnAsStrings(DataSource, "Depth (cm)");
                    double[] Thickness      = Soil.ToThickness(Depths);
                    double[] DepthMidPoints = Soil.ToMidPoints(Thickness);
                    DataTableUtility.AddColumn(DataSource, "DepthMidPoints (mm)", DepthMidPoints);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }

            // Add in LL series and SW if it is present.
            foreach (DataColumn Column in DataSource.Columns)
            {
                if (Column.ColumnName.Contains(" LL") || Column.ColumnName.Contains("SW"))
                {
                    Line Line = new Line();
                    Line.LinePen.Width = 2;
                    AddSeries(DataSource, Column.ColumnName, Line);
                }
            }

            // Get our data.
            AddDataSource(DataSource);

            AdjustTopAxisTitle = false;

            // For some charts were we don't have a predefined chart XML file we need to set
            // up some default chart settings.
            Chart.Axes.Left.Inverted = true;

            // If there are no series then add some e.g. Analysis
            if (Chart.Series.Count == 0)
            {
                bool FirstSeries = true;
                foreach (DataColumn Column in DataSource.Columns)
                {
                    if (Column.DataType == typeof(double) && !Column.ColumnName.Contains("Depth"))
                    {
                        string[] Values = DataTableUtility.GetColumnAsStrings(DataSource, Column.ColumnName);
                        if (MathUtility.ValuesInArray(Values))
                        {
                            Line Line = new Line();
                            Line.LinePen.Width = 2;
                            AddSeries(DataSource, Column.ColumnName, Line);
                            Line.Active = FirstSeries;
                            FirstSeries = false;
                        }
                    }
                }
                AdjustTopAxisTitle = true;
                FormatTopAxis();
            }


            // Now we can populate all series as we've created our series.
            PopulateSeries();
            Chart.Refresh();
        }
예제 #10
0
        static private void CreateTableFromSoil(Soil MySoil, DataTable Data, string ChildPath, ref int Row)
        {
            int NumLayers = MySoil.Thickness.Length;

            DataTableUtility.AddValue(Data, "Name", ChildPath, Row, NumLayers);
            DataTableUtility.AddValue(Data, "State", MySoil.State, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Region", MySoil.Region, Row, NumLayers);
            DataTableUtility.AddValue(Data, "NearestTown", MySoil.NearestTown, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Site", MySoil.Site, Row, NumLayers);
            DataTableUtility.AddValue(Data, "APSoilNumber", MySoil.ApsoilNumber, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Classification", MySoil.Classification, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Latitude(WGS84)", MySoil.Latitude, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Longitude(WGS84)", MySoil.Longitude, Row, NumLayers);
            DataTableUtility.AddValue(Data, "LocationAccuracy", MySoil.LocationAccuracy, Row, NumLayers);
            DataTableUtility.AddValue(Data, "DataSource", MySoil.DataSource, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Comments", MySoil.Comment, Row, NumLayers);
            DataTableUtility.AddValue(Data, "NaturalVegetation", MySoil.NaturalVegetation, Row, NumLayers);

            DataTableUtility.AddColumn(Data, "Thickness", MySoil.Thickness, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "BD", MySoil.BD, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Rocks", MySoil.Rocks, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Texture", MySoil.Texture, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "SAT", MySoil.SAT, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "DUL", MySoil.DUL, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "LL15", MySoil.LL15, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Airdry", MySoil.Airdry, Row, NumLayers);

            string[] CropOrder = { "wheat",    "barley",    "oats",    "canola",          "chickpea", "cotton",
                                   "sorghum",  "lentil",    "lupin",   "fieldpea",        "mungbean", "sunflower",
                                   "fababean", "lucerne",   "maize",   "perennial grass", "cowpea",   "navybean",
                                   "peanut",   "pigeonpea", "soybean", "stylo",           "sugar",    "lablab",
                                   "millet",   "triticale", "weed",    "medic" };
            for (int i = 0; i != 7; i++)
            {
                AddCropColumn(Data, CropOrder[i], MySoil, Row, NumLayers);
            }

            DataTableUtility.AddValue(Data, "SummerU", MySoil.SummerU, Row, NumLayers);
            DataTableUtility.AddValue(Data, "SummerCona", MySoil.SummerCona, Row, NumLayers);
            DataTableUtility.AddValue(Data, "WinterU", MySoil.WinterU, Row, NumLayers);
            DataTableUtility.AddValue(Data, "WinterCona", MySoil.WinterCona, Row, NumLayers);
            DataTableUtility.AddValue(Data, "SummerDate", "=\"" + MySoil.SummerDate + "\"", Row, NumLayers);
            DataTableUtility.AddValue(Data, "WinterDate", "=\"" + MySoil.WinterDate + "\"", Row, NumLayers);
            DataTableUtility.AddValue(Data, "U", MySoil.U, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Cona", MySoil.Cona, Row, NumLayers);
            DataTableUtility.AddValue(Data, "Salb", MySoil.Salb, Row, NumLayers);
            DataTableUtility.AddValue(Data, "DiffusConst", MySoil.DiffusConst, Row, NumLayers);
            DataTableUtility.AddValue(Data, "DiffusSlope", MySoil.DiffusSlope, Row, NumLayers);
            DataTableUtility.AddValue(Data, "CN2Bare", MySoil.CN2Bare, Row, NumLayers);
            DataTableUtility.AddValue(Data, "CNRed", MySoil.CNRed, Row, NumLayers);
            DataTableUtility.AddValue(Data, "CNCov", MySoil.CNCov, Row, NumLayers);
            DataTableUtility.AddValue(Data, "RootCN", MySoil.RootCN, Row, NumLayers);
            DataTableUtility.AddValue(Data, "RootWT", MySoil.RootWT, Row, NumLayers);
            DataTableUtility.AddValue(Data, "SoilCN", MySoil.SoilCN, Row, NumLayers);
            DataTableUtility.AddValue(Data, "EnrACoeff", MySoil.EnrACoeff, Row, NumLayers);
            DataTableUtility.AddValue(Data, "EnrBCoeff", MySoil.EnrBCoeff, Row, NumLayers);

            DataTableUtility.AddColumn(Data, "SWCON", MySoil.SWCON, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "MWCON", MySoil.MWCON, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "FBIOM", MySoil.FBIOM, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "FINERT", MySoil.FINERT, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "KS", MySoil.KS, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "OC", MySoil.OC, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "EC", MySoil.EC, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "PH", MySoil.PH, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "CL", MySoil.CL, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Boron", MySoil.Boron, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "CEC", MySoil.CEC, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Ca", MySoil.Ca, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Mg", MySoil.Mg, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Na", MySoil.Na, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "K", MySoil.K, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "ESP", MySoil.ESP, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Mn", MySoil.Mn, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "Al", MySoil.Al, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "ParticleSizeSand", MySoil.ParticleSizeSand, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "ParticleSizeSilt", MySoil.ParticleSizeSilt, Row, NumLayers);
            DataTableUtility.AddColumn(Data, "ParticleSizeClay", MySoil.ParticleSizeClay, Row, NumLayers);

            for (int i = 7; i != CropOrder.Length; i++)
            {
                AddCropColumn(Data, CropOrder[i], MySoil, Row, NumLayers);
            }

            // Add other crops not in our list above.
            foreach (string CropName in MySoil.CropsMeasured)
            {
                if (Array.IndexOf(CropOrder, CropName.ToLower()) == -1)
                {
                    AddCropColumn(Data, CropName, MySoil, Row, NumLayers);
                }
            }

            Row += NumLayers;
        }