3

我有一个包含经度和纬度值的 dataGridView。

我需要通过将值传递给DoSomethingMethod().

我不熟悉 dataGridView,因此我从 dataGridView 复制所有值并处理它List<>

下面是我在 dataGridView 中操作数据的代码

Public Main()
{
    List<double> lst_Long = new List<double>();
    List<double> lst_Latt = new List<double>();

    for (int rows = 0; rows < dataGridView1.Rows.Count; rows++)
    {
        lst_Long.Add(Convert.ToDouble(dataGridView1.Rows[rows].Cells["Long"].Value));
        lst_Latt.Add(Convert.ToDouble(dataGridView1.Rows[rows].Cells["Latt"].Value));            
    }

    int ColumnCount = lst_Long.Count - 1;
    int RowCount = lst_Row.Count - 1;

    //Pass the list to DoSomethingMethod
    DoSomethingMethod(lst_Long , lst_Latt, ColumnCount, RowCount);
}

DoSomethingMethod(List<double> lst_long, List<double> lst_latt, int ColumnCount, int RowCount)
{
    for (int iColumn = 0; iColumn < ColumnCount; iColumn++)
    {
        for (int iRow = 0; iRow < RowCount; iRow++)
        {
             // access my latitude value and longitude value here
             double myX = lst_latt[iRow]
             double myY = lst_long[iRow]

            // do some processing here with the value, lets say....
            double myNewX = myX + 10;
            double myNewY = myY + 10;

            PassNewDataToAnotherMethod( myNewX , myNewY );
        }

    }
}

我想问一下,是否有任何其他方法可以直接使用并从 dataGridView 获取单元格值,Columns["Long"]并在Columns["Latt"]不将 dataGridView 中的值复制到列表中的情况下执行类似的操作?

谢谢~

更新:下面是我的 DGV 表(数据是随机的,不是真实的)

在此处输入图像描述

更新我自己的答案,这个问题将关闭

// Pass the whole dataGridView1 into method and access the value through row count.
DoSomethingMethod(DataGridView dataGridView1)
{
    for (int rows = 0; rows < dataGridView1.Rows.Count; rows++)
    {
        double myX = Convert.ToDouble(dataGridView1.Rows[rows].Cells["Latt"].Value);
        double myY = Convert.ToDouble(dataGridView1.Rows[rows].Cells["Long"].Value);
    }
}
4

3 回答 3

2

一种方法(我想到的)是使用BindingSource自定义模型,因此您可以在数据绑定模型上操作,而不是对行进行操作。像这样的东西:

public class Location
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

//绑定网格

var bs = new BindingSource();
bs.DataSource = listOfLocations; // List<Location>
dataGridView1.DataSource = bs;   // thanks to binding source all changes in datagrid are
                                 // propagated to underlying data source (ie. List<Location>

然后您可以在listOfLocations不访问单元格中的值的情况下自行操作。

于 2013-06-04T06:59:20.503 回答
1

我不确定您实际上要达到的目标。这是另一种解决方案。希望此解决方案对您有用。

您可以使用 linq 创建一个元组列表并将其发送到 NewDoSomething 方法,如下所示

    Public Main()
    {   
        //Generate a list of Tuples using linq
        var tuples = from row in dataGridView1.Rows.Cast<DataGridViewRow>()
                     select new Tuple<double, double>(
                         Convert.ToDouble(row.Cells["longitude"].Value), 
                         Convert.ToDouble(row.Cells["latitude"].Value));

        //Pass the tuple list to DoSomethingMethod
        DoSomethingMethod(tuples);
    }

    private void DoSomeThing(IEnumerable<Tuple<double, double>> tuples)
    {
        //Iterate through the tuples
        foreach (Tuple<double, double> tuple in tuples)
        {
            double myX = tuple.Item1;
            double myY = tuple.Item2;
        }
    }

当然,这段代码可以细化。这只是显示了您可以使用的方法。

于 2013-06-04T07:03:10.287 回答
0

如果你使用 aDataTable作为数据源,你可以试试这个:

public void Main()
{
    DoSomethingMethod((DataTable)dataGridView1.DataSource);
}

private void DoSomethingMethod(DataTable dataTable)
{
    foreach (DataRow row in dataTable.Rows)
    {
        double myX = Convert.ToDouble(row["Latt"]);
        double myY = Convert.ToDouble(row["Long"]);
    }
}
于 2013-06-04T07:15:09.583 回答