1. /// <summary>
  2. /// Fixes column names. Requires all ColumnHeaders to have members (set GenerateMember to <c>true</c>).
  3. /// </summary>
  4. /// <param name="list">The ListView.</param>
  5. public static void FixColumnNames(ListView list)
  6. {
  7. List<ColumnHeader> columns = new List<ColumnHeader>();
  8. foreach (ColumnHeader column in list.Columns)
  9. {
  10. if (string.IsNullOrEmpty(column.Name))
  11. {
  12. columns.Add(column);
  13. }
  14. }
  15.  
  16. if (columns.Count == 0)
  17. {
  18. // no need to fix names
  19. return;
  20. }
  21.  
  22. Control parent = list.Parent;
  23.  
  24. while (parent != null)
  25. {
  26. FieldInfo listInfo = parent.GetType().GetField(list.Name, BindingFlags.NonPublic | BindingFlags.Instance);
  27.  
  28. if (listInfo != null)
  29. {
  30. // found a member with given name, let's check if it points to the same object
  31. if (object.ReferenceEquals(listInfo.GetValue(parent), list))
  32. {
  33. // yes, this member points to our object
  34. break;
  35. }
  36. }
  37.  
  38. parent = parent.Parent;
  39. }
  40.  
  41. if (parent != null)
  42. {
  43. foreach (ColumnHeader column in columns)
  44. {
  45. FieldInfo columnInfo = null;
  46.  
  47. // for all fields
  48. foreach (FieldInfo field in parent.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
  49. {
  50. // ...find the one pointing to column we're looking for
  51. if ((field.FieldType == column.GetType()) && (object.ReferenceEquals(field.GetValue(parent), column)))
  52. {
  53. // same type, same value -> yes, this is the member we're looking for
  54. columnInfo = field;
  55. break;
  56. }
  57. }
  58.  
  59. if (columnInfo != null)
  60. {
  61. try
  62. {
  63. column.Name = columnInfo.Name;
  64. }
  65. catch
  66. {
  67. // No idea why, but we don't want any exceptions...
  68. }
  69. }
  70. else
  71. {
  72. // no member found
  73. }
  74. }
  75. }
  76. else
  77. {
  78. // no parent found
  79. }
  80. }
  81.