【发布时间】:2021-03-15 14:10:38
【问题描述】:
我有一个 Datatable zct(区域/多边形坐标表),其列定义为:
private void buildZoneDataTable()
{
// Add columns to the DataTable.
zct.Columns.Add("Zone Name", System.Type.GetType("System.String"));
zct.Columns.Add("X_Coordinate", System.Type.GetType("System.Double"));
zct.Columns.Add("Y_Coordinate", System.Type.GetType("System.Double"));
coordDGV.DataSource = zct;
foreach (DataGridViewColumn dgvcol in coordDGV.Columns)
{
dgvcol.SortMode = DataGridViewColumnSortMode.NotSortable;
}
zct 的每一行都是我稍后将渲染的多边形顶点的坐标,但现在我的目标是拥有所有命名区域/多边形及其多边形坐标的嵌套列表。
这是我到目前为止创建单个多区域的内容:
private void BuildZoneList()
{
//iterate through all rows of the zct
for (int i = 0; i < zct.Rows.Count; i++)
{
//if first row, or row I has a different name start new zone
if(i == 0 || zct.Rows[i][0] != zct.Rows[i-1][0])
{
//create new polyzone named by the first column
PolyZone pZone = new PolyZone(zct.Rows[i][0].ToString());
}
}
}
这是我的 polyzone 类的 sn-p:
public class PolyZone
{
public string polyZoneName;
List<Point3D> pointList = new List<Point3D>(0);
Point3D polyCenter = new Point3D(0,0,0);
public PolyZone(string zoneName)
{
polyZoneName = zoneName;
}
public void add(Point3D point3D)
{
pointList.Append(point3D);
}
编辑:感谢 jdweng 的回答,我能够从列表中获取区域名称,但我无法获得要添加到列表中的点。下面是我如何重写 BuildZoneList 方法:
public List<PolyZone> BuildZoneList()
{
var zones = zct.AsEnumerable().GroupBy(x => x.Field<string>("Zone")).ToList();
List<PolyZone> listOfPolyZones = new List<PolyZone>();
foreach(var zone in zones)
{
PolyZone newZone = new PolyZone(zone.Key);
listOfPolyZones.Add(newZone);
foreach(DataRow row in zone)
{
double x = row.Field<double>("X_Coordinate");
double y = row.Field<double>("Y_Coordinate");
double z = ZoneyRender.elevation;
newZone.Add(new Point3D(x,y,z));
}
}
return listOfPolyZones;
}
这是我测试它的方式:
private void listZonesAndCoordsToolStripMenuItem_Click(object sender, EventArgs e)
{
List<PolyZone> listOfPolyZones = BuildZoneList();
foreach(PolyZone zone in listOfPolyZones)
{
MessageBox.Show("Zone:" + zone.polyZoneName);
foreach(Point3D p3d in zone.pointList)
{
MessageBox.Show("Zone:" + zone.polyZoneName + Environment.NewLine + p3d.ToString());
}
}
}
第一个带有区域名称的 mbox 很好,但是应该显示坐标的 mbox 从来没有弹出,让我觉得列表是空的。有什么我想念的吗? 谢谢!
【问题讨论】:
-
你有什么问题?
-
@JonasH,对不起,你的评论从我头上飞过,你能帮我把它哑巴吗?这里没有 SQL。
-
啊,对不起,我假设数据源来自数据库,如果不是你可以忽略我的评论。
标签: c# list datatable nested polygon