如何将dataGridView中的整列值传递给方法?

时间:2013-06-04 06:31:12

标签: c# winforms datagridview

我有一个包含经度和纬度值的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 );
        }

    }
}

我想问一下,如果有任何其他方法可以直接使用并从Columns["Long"]Columns["Latt"]的dataGridView获取单元格值,并执行类似的操作,将复制值从dataGridView转换为清单?

感谢〜

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

enter image description here

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

// 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);
    }
}

3 个答案:

答案 0 :(得分: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上操作而无需自己访问单元格中的值。

答案 1 :(得分: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;
        }
    }

当然这段代码可以改进。这只是展示了你可以使用的方法。

答案 2 :(得分:0)

如果您使用DataTable作为数据源,可以尝试这样做:

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"]);
    }
}