Проблема с отрисовкой Datagrid ExpandoObjectC#

Место общения программистов C#
Ответить
Anonymous
 Проблема с отрисовкой Datagrid ExpandoObject

Сообщение Anonymous »

У меня возникла проблема при попытке привязать ExpandoObject к моей Datagrid; загружается слишком долго. Например, для 6 столбцов и 50 строк это занимает около 10 секунд.
Я использую ExpandoObject, потому что мне нужно добавить свойство к моему объекту во время выполнения.
По сути, пользователь выбирает «Тест», в моем коде я добавляю в свою Datagrid 2 новых столбца с именами «X» и «Y», каждый тест, который пользователь будет проверять, добавит еще два столбца. из «Х и "Y".
вот мой код:

Код: Выделить всё

public void Fill_Table_Performance()
{
if (main.tab_table.IsSelected && main.Table_performance_AVG != null)
{
list_dynamic_object = new List
{
new List(),new List(),
new List(),new List()
};

List list_count_oos = new List
{
new double(),new double(),new double(),new double()
};

int count = -1;

var List_Test_Num = main.Table_performance_AVG.AsEnumerable()
.GroupBy(r => new { Test_Num = r["Test_Num"] })
.Select(g => g.First())
.ToList();

for (int i = 0; i < List_Table_Performance.Count; i++)
{
count++;
var list_column = List_Table_Performance[i].Columns.Where(x => x.Header.ToString().Contains("X") || x.Header.ToString().Contains("Y")).ToList();

foreach (DataGridTextColumn column in list_column)
{
List_Table_Performance[i].Columns.Remove(column);
}

List_Table_Performance[i].ItemsSource = null;

foreach (DataRow Test_Num in List_Test_Num)
{
var list_column_per_test = List_Table_Performance[i].Columns.Where(x => x.SortMemberPath.ToString() == "X" + int.Parse(Test_Num["Test_Num"].ToString())).ToList();

if (list_column_per_test.Count == 0)
{
Binding Binding_X = new Binding();
Binding_X.Path = new PropertyPath("X" + int.Parse(Test_Num["Test_Num"].ToString()));
Binding_X.IsAsync = true;

Binding Binding_Y = new Binding();
Binding_Y.Path = new PropertyPath("Y" + int.Parse(Test_Num["Test_Num"].ToString()));
Binding_Y.IsAsync = true;

DataGridTextColumn Column_X = new DataGridTextColumn
{
Header = "X",
Binding = Binding_X,
Width = 50,
SortMemberPath = "X" + int.Parse(Test_Num["Test_Num"].ToString())
};

Style columnStyle_X = new Style(typeof(TextBlock));
DataTrigger Trigger_X = new DataTrigger();
Trigger_X.Binding = new Binding("Spec_X" + int.Parse(Test_Num["Test_Num"].ToString()));
Trigger_X.Value = true;
Trigger_X.Setters.Add(
new Setter(
TextBlock.ForegroundProperty,
new SolidColorBrush(Colors.Firebrick)));
columnStyle_X.Triggers.Add(Trigger_X);
Column_X.ElementStyle = columnStyle_X;

DataGridTextColumn Column_Y = new DataGridTextColumn
{
Header = "Y",
Binding = Binding_Y,
Width = 50,
SortMemberPath = "Y" + int.Parse(Test_Num["Test_Num"].ToString())
};

Style columnStyle_Y = new Style(typeof(TextBlock));
DataTrigger Trigger_Y = new DataTrigger();
Trigger_Y.Binding = new Binding("Spec_Y"  + int.Parse(Test_Num["Test_Num"].ToString()));
Trigger_Y.Value = true;
Trigger_Y.Setters.Add(
new Setter(
TextBlock.ForegroundProperty,
new SolidColorBrush(Colors.Firebrick)));
columnStyle_Y.Triggers.Add(Trigger_Y);
Column_Y.ElementStyle = columnStyle_Y;

List_Table_Performance[i].Columns.Add(Column_X);
List_Table_Performance[i].Columns.Add(Column_Y);
}
}

foreach (DataRow dt in main.Table_performance_AVG.Rows)
{
List list_date = list_dynamic_object[i].Cast().Where(x => x.Date == ((DateTime)dt["Date"]).ToString("M/d/yyyy HH:mm:ss").ToString()).ToList();
List list_recipe = list_dynamic_object[i].Cast().Where(x => x.Recipe == dt["Recipe_Name"].ToString()).ToList();

if (list_date.Count() == 0 || dt["Test_Num"].ToString() == list_date[0].Test_Num)
{
IDictionary table = new ExpandoObject();

table.Add("Recipe", list_recipe.Any() == false ? dt["Recipe_Name"].ToString() : "");
table.Add("Date", ((DateTime)dt["Date"]).ToString("M/d/yyyy HH:mm:ss").ToString());
table.Add("X" + dt["Test_Num"].ToString(), dt[i + count].ToString() == "-99999" ? null : (double?)dt[i + count]);
table.Add("Y" + dt["Test_Num"].ToString(), dt[i + 1 + count].ToString() == "-99999" ? null : (double?)dt[i + 1 + count]);
table.Add("Spec_X" + dt["Test_Num"].ToString(), false);
table.Add("Spec_Y" + dt["Test_Num"].ToString(), false);
table.Add("Test_Num", dt["Test_Num"].ToString());

if (i > 0)
{
if (dt[List_Table_Performance[i].Uid + "_Spec"].ToString() != "-99999")
{
if (List_Table_Performance[i].Uid == "Test" ?
(double.Parse(table["X" + dt["Test_Num"].ToString()].ToString()) > double.Parse(dt[List_Table_Performance[i].Uid + "_Spec"].ToString()) ||
double.Parse(table["X" + dt["Test_Num"].ToString()].ToString()) < double.Parse(dt[List_Table_Performance[i].Uid + "_Spec"].ToString()) * -1) :
(double.Parse(table["X" + dt["Test_Num"].ToString()].ToString()) > double.Parse(dt[List_Table_Performance[i].Uid + "_Spec"].ToString())
|| double.Parse(table["X" + dt["Test_Num"].ToString()].ToString()) < 0))
{
table["Spec_X" + dt["Test_Num"].ToString()] = true;
}

if (List_Table_Performance[i].Uid == "Test" ?
(double.Parse(table["Y" + dt["Test_Num"].ToString()].ToString()) > double.Parse(dt[List_Table_Performance[i].Uid + "_Spec"].ToString()) ||
double.Parse(table["Y" + dt["Test_Num"].ToString()].ToString()) < double.Parse(dt[List_Table_Performance[i].Uid + "_Spec"].ToString()) * -1) :
(double.Parse(table["Y" + dt["Test_Num"].ToString()].ToString()) > double.Parse(dt[List_Table_Performance[i].Uid + "_Spec"].ToString())
|| double.Parse(table["Y" + dt["Test_Num"].ToString()].ToString()) < 0))
{
table["Spec_Y" + dt["Test_Num"].ToString()] = true;
}

if (bool.Parse(table["Spec_X" + dt["Test_Num"].ToString()].ToString()) == true || bool.Parse(table["Spec_Y"  + dt["Test_Num"].ToString()].ToString()) == true)
{
list_count_oos[i]++;
}
}
}

list_dynamic_object[i].Add(table);
}

else
{
int index = list_dynamic_object[i].Cast().ToList().IndexOf(list_date[0]);

IDictionary table_new_test = list_date[0] as IDictionary;
table_new_test.Add("X" + dt["Test_Num"].ToString(), dt[i + count].ToString() == "-99999" ? null : (double?)dt[i + count]);
table_new_test.Add("Y" + dt["Test_Num"].ToString(), dt[i + 1 + count].ToString() == "-99999" ? null : (double?)dt[i + 1 + count]);
//table_ovl1.X1 = main.Table_performance_AVG.Rows[main.Table_performance_AVG.Rows.Count - 1][i].ToString() == "-99999.0" ? null : main.Table_performance_AVG.Rows[main.Table_performance_AVG.Rows.Count - 1][i].ToString();
//table_ovl1.Y1 = main.Table_performance_AVG.Rows[main.Table_performance_AVG.Rows.Count - 1][i].ToString() == "-99999.0" ? null : main.Table_performance_AVG.Rows[main.Table_performance_AVG.Rows.Count - 1][i].ToString();
table_new_test["Test_Num"] = dt["Test_Num"].ToString();

list_dynamic_object[i][index] = table_new_test;
}
}
}

for (int i = 0; i < List_Table_Performance.Count; i++)
{
List_Table_Performance[i].ItemsSource = list_dynamic_object[i];
List_Table_Performance_OOS[i].Text = "Out of Spec: " + Math.Ceiling((list_count_oos[i] / (List_Table_Performance[i].Items.Count)) * 100) + "%";
}
}
}
Я установил некоторые свойства Datagrid, например: AutoGenerateColumns="False" и ScrollViewer.CanContentScroll="False"; это помогает при прокрутке, но не при рендеринге.
Спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ring-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»