轉帖|其它|編輯:郝浩|2011-06-03 16:18:20.000|閱讀 3932 次
概述:歷經了半個月的時間,終于做出了一個可以實現如題功能的自定義DataGrid控件(也就是個UserControl)。不過由于這個控件有點依賴與我們項目中的其他東西,所以我把之前做的一個類天拿出來和大家分享一下,這個類是那個控件的核心,控件也就是在這個類的基礎上包了層XAML代碼,加了些我們項目中特有的東西而已。我覺得這個東西對于我這畢業還不到一年的菜鳥來說還是有一些難度的。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
歷經了半個月的時間,終于做出了一個可以實現如題功能的自定義DataGrid控件(也就是個UserControl)。不過由于這個控件有點依賴與我們項目中的其他東西,所以我把之前做的一個類天拿出來和大家分享一下,這個類是那個控件的核心,控件也就是在這個類的基礎上包了層XAML代碼,加了些我們項目中特有的東西而已。我覺得這個東西對于我這畢業還不到一年的菜鳥來說還是有一些難度的。
下面貼出代碼,我覺得我在代碼里面寫的注釋挺詳細,文章中就不再多說了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
using System.Xml;
using System.Windows.Controls;
using System.Windows;
namespace TincyhoHelper
{
/// <summary>
/// 聲明全局變量,一個string型,作為文件名,一個DataGrid型,即指定的DataGrid
/// 實例化時將指定的DataGrid和文件名作為參數傳入該類。
/// 載入頁面時,先加載右鍵菜單。再從XML文件讀取配置信息,這里必須加System.IO.File.Exist()條件判斷文件是否存在
/// 關閉頁面時將配置信息寫入XML文件
/// </summary>
public class ColumnHelper
{
string filename;
XmlDocument xmlDoc = new XmlDocument();
DataGrid dgPerson;
/// <summary>
/// 用指定的DataGrid和文件名初始化ColumnHelper類的新實例
/// </summary>
/// <param name="dgPerson"></param>
public ColumnHelper(DataGrid dgPerson, string filename)
{
// TODO: Complete member initialization
this.dgPerson = dgPerson;
this.filename = filename;
}
/// <summary>
/// 添加右鍵菜單中的CheckBox
/// </summary>
/// <param name="content">CheckBox顯示的名字</param>
/// <param name="source">綁定的列名</param>
public void addCheckbox()
{
ContextMenu cm = new ContextMenu();
for (int i = 0; i < dgPerson.Columns.Count; i++)
{
CheckBox cb = new CheckBox();
cb.Content = dgPerson.Columns[i].Header.ToString();
bindColumnAndCheckbox(dgPerson.Columns[i], cb);
cm.Items.Add(cb);
}
dgPerson.ContextMenu = cm;
}
/// <summary>
/// 將DataGrid中的列的Visibility屬性和CheckBox的IsCheck屬性綁定
/// </summary>
/// <param name="column">綁定的列名</param>
/// <param name="checkbox">顯示的CheckBox</param>
public void bindColumnAndCheckbox(object column, CheckBox checkbox)
{
Binding binding = new Binding("Visibility");
binding.Source = column;
binding.Converter = new MyConverter(); // 設定Converter
checkbox.SetBinding(CheckBox.IsCheckedProperty, binding);
}
/// <summary>
/// 讀取XML文件中的配置信息
/// </summary>
/// <param name="filename">XML文件路徑</param>
public void readXML()
{
try
{
xmlDoc.Load(filename);
XmlNodeList list = xmlDoc.GetElementsByTagName("*");
XmlElement element;
for (int i = 1; i < list.Count; i++)
{
element = (XmlElement)list.Item(i);
080
string str = element.InnerText.ToString();
dgPerson.Columns[i - 1].Visibility = (Visibility)Enum.Parse(typeof(Visibility), str, true);
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 將配置信息寫入XML文件中
/// </summary>
/// <param name="filename">XML文件路徑</param>
public void writeXML()
{
try
{
XmlNode xmlNode = xmlDoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
XmlNode myNode = xmlDoc.CreateNode(XmlNodeType.Element, "appSetting", "");
if (!System.IO.File.Exists(filename))
{
xmlDoc.AppendChild(xmlNode);
xmlDoc.AppendChild(myNode);
for (int i = 0; i < dgPerson.Columns.Count; i++)
{
string strRoot = dgPerson.Columns[i].Header.ToString();
string strText = dgPerson.Columns[i].Visibility.ToString();
XmlElement xmlelem = xmlDoc.CreateElement("", strRoot, "");
xmlelem.InnerText = strText;
myNode.AppendChild(xmlelem);
}
xmlDoc.Save(filename);
}
else
{
xmlDoc.Load(filename);
XmlNodeList list = xmlDoc.GetElementsByTagName("*");
XmlElement element;
for (int i = 1; i < list.Count; i++)
{
element = (XmlElement)list.Item(i);
element.InnerText = dgPerson.Columns[i - 1].Visibility.ToString();
}
xmlDoc.Save(filename);
}
}
catch (Exception ex)
{
130
throw ex;
}
}
}
/// <summary>
/// 轉換器。功能:使CheckBox的IsChecked屬性和DataGrid控件中的列的Visibility屬性可以關聯。
/// </summary>
[ValueConversion(typeof(Enum), typeof(bool?))]
public class MyConverter : IValueConverter
{
/// <summary>
/// 將DataGrid列的Visibility屬性轉換為bool型,方便CheckBox的IsChecked屬性賦值
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string str = System.Convert.ToString(value);
if (str.Equals("Visible"))
return true;
else
return false;
}
/// <summary>
/// 將CheckBox的IsChecked屬性的bool值轉換成Visibility屬性,方便DataGrid列屬性賦值
/// </summary>
/// <param name="value"></param>
164
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
bool b = System.Convert.ToBoolean(value);
if (b.Equals(true))
{
return (Visibility)Enum.Parse(typeof(Visibility), "Visible", true);
}
else
return (Visibility)Enum.Parse(typeof(Visibility), "Hidden", true);
}
}
}
<SPAN style="FONT-SIZE: 14px"> 在使用的時候,只要實例化一下這個類就可以了(這里記得要把需要該功能的DataGrid作為參數傳入,由于我這里使用的是XML文件來保存用戶的自定義列布局,所以還要將保存</SPAN>
<SPAN style="FONT-SIZE: 14px">XML的文件名也作為參數傳入)。在頁面加載時讀取XML文件里的信息,以此判斷哪些列顯示,哪些列不顯示。第一次運行時這個XML文件肯定不存在,所以要加上判斷條件,不存</SPAN>
<SPAN style="FONT-SIZE: 14px">在就不管了(第一次運行肯定所有列都要顯示出來),以后運行的話文件肯定已經存在了,這是再進行讀取XML操作就好。頁面關閉的時候調用寫入XML的方法。 最終的運行效果</SPAN>
<SPAN style="FONT-SIZE: 14px">就是當在DataGrid控件上點擊右鍵的時候,彈出和DataGrid中的列一一對應的CheckBox,并且CheckBox的IsChecked屬性和DataGrid列的Visibility屬性已經綁定。</SPAN>
<SPAN style="FONT-SIZE: 14px">截圖如下:</SPAN>
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園