VB C# .NET Freamworkの備忘録

C#, VB.NET Freamworkの備忘録を掲載しています。 コントロール、WPF、スレッド、共通関数と実用的なコードを掲載してきます。

2014年11月


    /// <summary>
    /// Enumerableの拡張メソッド
    /// </summary>
    public static class EnumerableExtensions
    {
        public static void ForEach<T>(this IEnumerable<T> source,Action<T> action)
        {
            foreach (T element in source)
                action(element);
        }

        public static int ForEach<T>(this IEnumerable<T> list, Action<int, T> action)
        {
            var index = 0;

            foreach (var elem in list)
                action(index++, elem);

            return index;
        }

        public static T With<T>(this T item, Action<T> action)
        {
            action(item);
            return item;
        }
    } 

使用方法

バインディング時に文字列ではなくて、プロパティ情報からプロパティ名を取得することで、変数名の変更に自動的に対応できる。

           this.rdbPlan.DataBindings.Add(new Binding("Checked", dto, PropertyUtils.GetPropertyName(dto, o => o.IsPLAN), false, DataSourceUpdateMode.OnPropertyChanged));

プロパティ情報の取得用のクラスです。
 

    public static class PropertyUtils
    {
        /// <summary>
        /// プロパティ名の取得を行います。
        /// </summary>
        /// <typeparam name="TSource">対象のオブジェクト</typeparam>
        /// <typeparam name="TProp">ラムダ式のプロパティ</typeparam>
        /// <param name="source">対象のオブジェクト</param>
        /// <param name="expression">ラムダ式のプロパティ</param>
        /// <returns>プロパティ名</returns>
        public static string GetPropertyName<TSource,TProp>(TSource source,Expression<Func<TSource, TProp>> expression)
        {

            var body = expression.Body as MemberExpression;
            if (body == null) throw new ArgumentException("'expression' should be a member expression");

            return body.Member.Name;

        }

        /// <summary>
        /// プロパティ情報名の取得を行います。
        /// </summary>
        /// <typeparam name="TSource">対象のオブジェクト</typeparam>
        /// <typeparam name="TProp">ラムダ式のプロパティ</typeparam>
        /// <param name="source">対象のオブジェクト</param>
        /// <param name="expression">ラムダ式のプロパティ</param>
        /// <returns>プロパティ名</returns>
        public static PropertyInfo GetPropertyInfo<TSource, TProp>(TSource source, Expression<Func<TSource, TProp>> expression)
        {
            return source.GetType().GetProperty(GetPropertyName(source, expression));
        }

        public static PropertyInfo GetPropertyInfo(object property, string propertyName)
        {
            var arrayProperties = property.GetType().GetProperties();
            foreach (PropertyInfo propertyInfo in arrayProperties)
            {
                if (propertyInfo.Name == propertyName)
                {
                    return propertyInfo;
                }
            }

            return null;
        } 
  } 


WindowsFormのDataGridViewに以下のイベントを追加することで、
オブジェクトに「○○.××」のようなバインディングを可能とする



        /// <summary>
        /// セルの内容が書式用に変更されなければならない時にコールバックされます。
        /// </summary>
        /// <param name="sender">イベント発生元</param>
        /// <param name="e">イベント引数</param>
        private void dgvSettingList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            EventUtils.Grid_CellFormatting(sender, e);
        }

補助クラス

    public class EventUtils
    {

        /// <summary>
        /// グリッドのバインディングの値をコールバックします。
        /// </summary>
        /// <param name="sender">イベント発生元</param>
        /// <param name="e">イベント引数</param>
        public static void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            var grid = (DataGridView)sender;
            if ((grid.Rows[e.RowIndex].DataBoundItem != null) &&
                (grid.Columns[e.ColumnIndex].DataPropertyName.Contains(".")))
            {
                e.Value = PropertyUtils.BindProperty(
                              grid.Rows[e.RowIndex].DataBoundItem,
                              grid.Columns[e.ColumnIndex].DataPropertyName
                            );
            }
        }
    }

     public static class PropertyUtils
    {
       public static string BindProperty(object property, string propertyName)
        {
            string retValue = "";

            if (propertyName.Contains("."))
            {
                var leftPropertyName = propertyName.Substring(0, propertyName.IndexOf(".", System.StringComparison.Ordinal));
                var arrayProperties = property.GetType().GetProperties();

                foreach (PropertyInfo propertyInfo in arrayProperties)
                {
                    if (propertyInfo.Name == leftPropertyName)
                    {
                        retValue = BindProperty(
                          propertyInfo.GetValue(property, null),
                          propertyName.Substring(propertyName.IndexOf(".", System.StringComparison.Ordinal) + 1));
                        break;
                    }
                }
            }
            else
            {
                var propertyType = property.GetType();
                var propertyInfo = propertyType.GetProperty(propertyName);
                retValue = propertyInfo.GetValue(property, null).ToString();
            }

            return retValue;
        }

    } 

↑このページのトップヘ