PDA

View Full Version : سوال: اشکال در مرتب سازی دیتاگرید به صورت داینامیک



hossein626
یک شنبه 16 آبان 1395, 07:40 صبح
سلام دوستان
من در برنامه ام گرید دارم که به صورت داینامیک از دیتابیس پر می شود.
<DataGrid x:Name="GrdKalaForTest" FontFamily="B Nazanin" FontSize="15" GridLinesVisibility="All" HorizontalGridLinesBrush="#FFCACACA" VerticalGridLinesBrush="#FFCACACA"
VerticalAlignment="Stretch" AlternationCount="1" AlternatingRowBackground="Azure"
Margin="38,58,38,213"
/>
کاربر می تواند روی گرید تغییر ایجاد کند و مثلا اندازه ستون ها را کم و زیاد کند یا روی چند ستون مرتب سازی انجام دهد. این تغییرات به صورت یک فایل xml ذخیره می شود و کاربر بعد از این هروقت وارد فرم می شود تغییرات قبلی از فایل xml خوانده شده و روی گرید اعمال می شود.
143371
مشکل اینجاست که مرتب سازی درست انجام نمی شود. هدر گرید نشان می دهد که مرتب شده اما دیتای درون آن مرتب نمی شود. ستون Producer نزولی مرتب شده اما دیتای آن تغییری نکرده.
به نظر شما مشکل از چیست؟
این کدی است که sort با ان انجام می شود:
public static void RestoreGridSetting(ref DataGrid grd, string FileName)
{
try
{
if (!File.Exists("Setting\\" + FileName + ".xml"))
{
return;
}

XmlDocument xmldoc = new XmlDocument();

XmlNodeList xmlnodeList;

FileStream fs = new FileStream("Setting\\" + FileName + ".xml", FileMode.Open, FileAccess.Read);
xmldoc.Load(fs);
fs.Close();

xmlnodeList = xmldoc.GetElementsByTagName("column");

grd.Items.SortDescriptions.Clear();

foreach (DataGridColumn Column in grd.Columns)
{
XmlNode Column_Node = (from elem in xmlnodeList.Cast<XmlNode>()
where elem.ChildNodes.Item(0).InnerText.Trim() == Column.Header.ToString()
select elem).FirstOrDefault();

if (Column_Node != null)
{
Column.Width = int.Parse(Column_Node.ChildNodes.Item(1).InnerText .Trim());
Column.Header = Column_Node.ChildNodes.Item(2).InnerText.Trim();
int DisplayIndex = int.Parse(Column_Node.ChildNodes.Item(3).InnerText .Trim());
Column.DisplayIndex = DisplayIndex;
bool visible = Convert.ToBoolean(Column_Node.ChildNodes.Item(4).I nnerText.Trim());
Column.Visibility = visible == true ? Visibility.Visible : Visibility.Hidden;

if (Column_Node.ChildNodes.Item(5) != null)
{
Column.SortDirection = Column_Node.ChildNodes.Item(5).InnerText.Trim() == "Ascending" ? ListSortDirection.Ascending : ListSortDirection.Descending;
}
}

grd.Items.Refresh();
}


}
catch (Exception ex)
{
MessageBox.Show("RestoreGridSetting: " + ex.Message);
}
}
ممنون از دوستان

hossein626
یک شنبه 16 آبان 1395, 16:14 عصر
سلام مجدد
پروژه به همراه فایل xml را ضمیمه می کنم.
https://www.mediafire.com/?5xs16zbhm3bq0py

ژیار رحیمی
دوشنبه 17 آبان 1395, 08:50 صبح
دوست گرامی مرتب سازی یک property پیش فرض در datagrid هست که در wpf و winform بصورت پیش فرض true هست لازم به کد نویسی برای مرتب کردن ستون ها نیست و کار اضافه ایی انجام میدی.دلیل مشکل شمام تداخل دو مرتب سازی هست (مرتب سازی پیش فرض خود دیتاگرید و مرتب سازی که شما براش کد نوشتی)

hossein626
دوشنبه 17 آبان 1395, 09:34 صبح
سلام دوست عزیز
بله درسته حرف شما. اما در برنامه من وقتی کاربر تغییری در گرید مانند تغییر سایز ستون یا مرتب کردن یک ستون داد و از فرم خارج شد تنظیمات ش ذخیره می شود و در برگشت به فرم دوباره تنظیمات باید روی گرید اعمال شود. به همین دلیل مجبورم که مرتب سازی را به صورت داینامیک و با کد نویسی انجام بدم.

ژیار رحیمی
دوشنبه 17 آبان 1395, 09:56 صبح
خاصیت پیش فرض خود دیتاگرید رو false کن .مقاله زیر رو مطالعه نمایید به مراتب کارشما رو آسونتر میکنه اگر از این روش استفاده نمایی
http://www.bengribaudo.com/blog/2012/03/14/1942/saving-restoring-wpf-datagrid-columns-size-sorting-and-order

Mahmoud.Afrad
دوشنبه 17 آبان 1395, 11:38 صبح
پراپرتی SortDirection در datagrid به خودی خود عمل مرتب سازی رو انجام نمیده. این پراپرتی فقط فلش مربوط به مرتب سازی ستون (رو به بالا و یا پایین) را ایجاد میکنه.
منبع: https://blogs.msdn.microsoft.com/vinsibal/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid

متد RestoreGridSetting جایی که sortdirection رو ست میکنید(خط 37 تا 40) به صورت زیر اصلاح کنید
if (Column_Node.ChildNodes.Item(5) != null)
{
ListSortDirection sortDirection = (ListSortDirection)Enum.Parse(typeof(ListSortDirec tion), Column_Node.ChildNodes.Item(5).InnerText.Trim() , true);
Column.SortDirection = sortDirection;
grd.Items.SortDescriptions.Add(new SortDescription(Column.SortMemberPath, sortDirection));
}
به خط 43 هم فکر نمیکنم نیازی باشه.

ژیار رحیمی
دوشنبه 17 آبان 1395, 14:07 عصر
CanUserSort حالت sorting رو برای ستون مورد نظر فعال و بدرستی عملیات Sortingرو انجام می شود

<DataGrid >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" CanUserSort="False" />
<DataGridTextColumn Binding="{Binding Name}" CanUserSort="True" />
</DataGrid.Columns>
</DataGrid>

hossein626
دوشنبه 17 آبان 1395, 17:42 عصر
پراپرتی SortDirection در datagrid به خودی خود عمل مرتب سازی رو انجام نمیده. این پراپرتی فقط فلش مربوط به مرتب سازی ستون (رو به بالا و یا پایین) را ایجاد میکنه.
منبع: https://blogs.msdn.microsoft.com/vinsibal/2009/04/14/5-more-random-gotchas-with-the-wpf-datagrid

متد RestoreGridSetting جایی که sortdirection رو ست میکنید(خط 37 تا 40) به صورت زیر اصلاح کنید
if (Column_Node.ChildNodes.Item(5) != null)
{
ListSortDirection sortDirection = (ListSortDirection)Enum.Parse(typeof(ListSortDirec tion), Column_Node.ChildNodes.Item(5).InnerText.Trim() , true);
Column.SortDirection = sortDirection;
grd.Items.SortDescriptions.Add(new SortDescription(Column.SortMemberPath, sortDirection));
}
به خط 43 هم فکر نمیکنم نیازی باشه.

بله مشکل حل شد بالاخره. مرسی ممنون از شما و همه دوستان :)