我正在處理在 WPF 視窗中顯示二維陣列的要求。陣列的大小最大為 360*720。我曾嘗試使用系結到 DataDrid 的 DataTable,但是加載網格需要很長時間并且非常消耗 RAM。我的示例代碼如下。
public void SetData(double[][] array)
{
if(array.Length <= 0)
return;
DataTable table = new DataTable();
for (int i = 0; i < array[0].Length; i )
{
table.Columns.Add(i.ToString(), typeof(double));
}
for (int i = 0; i < array.Length; i )
{
DataRow row = table.NewRow();
for (int j = 0; j < array[i].Length; j )
{
row[j] = array[i][j].ToString();
}
table.Rows.Add(row);
}
dataGrid.DataContext = table;
}
我創建了一個維度為 360 * 720 的 double 陣列,并呼叫了上面的 SetData() 方法。結果,程式占用的 RAM 增加了幾個 GB,非常耗時。
我想知道是否有一種優雅的方法可以解決這個問題,或者我的代碼中存在一些缺點。謝謝你。
uj5u.com熱心網友回復:
感謝所有這些有用的答案和評論,它們對我有很大幫助。經過一番搜索,我似乎找到了我的代碼花費這么多時間來渲染 DataGrid 的原因。我之前用 ScrollViewer 包裹了網格。我洗掉了它,它進行得很好。這是我找到提示的鏈接。WPF DataGrid 的渲染速度非常慢。
謝謝你們。
uj5u.com熱心網友回復:
創建一個單獨的類,可以將列舉數作為資料回傳。
class ArrayVisitor : IEnumerable<double[]>
{
private double[,] _data;
public ArrayVisitor()
{
}
public ArrayVisitor(double[,] data)
{
_data = data;
}
public double[,] Data
{
get { return _data; }
set { _data = value; }
}
#region IEnumerable<double[]> Members
public IEnumerator<double[]> GetEnumerator()
{
if (_data == null)
throw new ArgumentException("Data cannot be null.", "Data");
int len2d = _data.GetLength(1);
for (int i = 0; i < _data.GetLength(0); i )
{
double[] arr = new double[len2d];
for (int j = 0; j < len2d; j )
{
arr[j] = _data[i, j];
}
yield return arr;
}
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
#endregion
}
You can use Listview and Gridview as Databound controls.
private void Bindng2DArrayToListview2
(ListView listview, double[,] data, string[] columnNames)
{
Check2DArrayMatchColumnNames(data, columnNames);
GridView gv = new GridView();
for (int i = 0; i < data.GetLength(1); i )
{
GridViewColumn col = new GridViewColumn();
col.Header = columnNames[i];
col.DisplayMemberBinding = new Binding("[" i "]");
gv.Columns.Add(col);
}
ArrayVisitor arrayVisitor = new ArrayVisitor(data);
listview.View = gv;
listview.ItemsSource = arrayVisitor;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417730.html
標籤:
