DataSelectorControl.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using System.ComponentModel;
  6. using FastReport.Utils;
  7. using FastReport.Data;
  8. namespace FastReport.Dialog
  9. {
  10. /// <summary>
  11. /// Represents the control with two lists (available items and selected items).
  12. /// </summary>
  13. /// <remarks>
  14. /// The control allows to select one or several items and then filter the datasource which it is connected to.
  15. /// All you need is to setup the <b>DataColumn</b> property.
  16. /// </remarks>
  17. public partial class DataSelectorControl : DataFilterBaseControl
  18. {
  19. private Panel pnPanel;
  20. private ListBox lvAvailableItems;
  21. private ListBox lvSelectedItems;
  22. private Button btnAddItem;
  23. private Button btnAddItems;
  24. private Button btnRemoveItem;
  25. private Button btnRemoveItems;
  26. #region Properties
  27. /// <summary>
  28. /// Gets or sets a value indicating that the items must be sorted.
  29. /// </summary>
  30. [DefaultValue(false)]
  31. [Category("Behavior")]
  32. public bool Sorted
  33. {
  34. get { return lvAvailableItems.Sorted; }
  35. set
  36. {
  37. lvAvailableItems.Sorted = value;
  38. lvSelectedItems.Sorted = value;
  39. }
  40. }
  41. /// <inheritdoc/>
  42. public override float Width
  43. {
  44. get { return base.Width; }
  45. set
  46. {
  47. base.Width = value;
  48. UpdateLayout();
  49. }
  50. }
  51. /// <inheritdoc/>
  52. public override float Height
  53. {
  54. get { return base.Height; }
  55. set
  56. {
  57. base.Height = value;
  58. UpdateLayout();
  59. }
  60. }
  61. #endregion
  62. #region Private Methods
  63. private void UpdateLayout()
  64. {
  65. lvAvailableItems.Size = new Size(pnPanel.Width / 2 - 28, pnPanel.Height);
  66. lvSelectedItems.Size = lvAvailableItems.Size;
  67. lvSelectedItems.Left = pnPanel.Width - lvSelectedItems.Width;
  68. btnAddItem.Size = new Size(32, 24);
  69. btnAddItem.Location = new Point(lvSelectedItems.Left - 44, 0);
  70. btnAddItems.Size = btnAddItem.Size;
  71. btnAddItems.Location = new Point(btnAddItem.Left, btnAddItem.Height + 1);
  72. btnRemoveItem.Size = btnAddItem.Size;
  73. btnRemoveItem.Location = new Point(btnAddItem.Left, btnAddItem.Height * 3);
  74. btnRemoveItems.Size = btnAddItem.Size;
  75. btnRemoveItems.Location = new Point(btnAddItem.Left, btnRemoveItem.Bottom + 1);
  76. }
  77. private void UpdateButtons()
  78. {
  79. btnAddItem.Enabled = lvAvailableItems.SelectedItems.Count > 0;
  80. btnAddItems.Enabled = lvAvailableItems.Items.Count > 0;
  81. btnRemoveItem.Enabled = lvSelectedItems.SelectedItems.Count > 0;
  82. btnRemoveItems.Enabled = lvSelectedItems.Items.Count > 0;
  83. }
  84. private void pnPanel_Resize(object sender, EventArgs e)
  85. {
  86. UpdateLayout();
  87. }
  88. private void btnAddItem_Click(object sender, EventArgs e)
  89. {
  90. int index = 0;
  91. while (lvAvailableItems.SelectedItems.Count > 0)
  92. {
  93. object item = lvAvailableItems.SelectedItems[0];
  94. index = lvAvailableItems.Items.IndexOf(item);
  95. lvAvailableItems.Items.Remove(item);
  96. lvSelectedItems.Items.Add(item);
  97. }
  98. if (index >= lvAvailableItems.Items.Count)
  99. index = lvAvailableItems.Items.Count - 1;
  100. if (index < 0)
  101. index = 0;
  102. if (index < lvAvailableItems.Items.Count)
  103. lvAvailableItems.SelectedIndex = index;
  104. OnFilterChanged();
  105. UpdateButtons();
  106. }
  107. private void btnAddItems_Click(object sender, EventArgs e)
  108. {
  109. while (lvAvailableItems.Items.Count > 0)
  110. {
  111. object item = lvAvailableItems.Items[0];
  112. lvAvailableItems.Items.Remove(item);
  113. lvSelectedItems.Items.Add(item);
  114. }
  115. OnFilterChanged();
  116. UpdateButtons();
  117. }
  118. private void btnRemoveItem_Click(object sender, EventArgs e)
  119. {
  120. int index = 0;
  121. while (lvSelectedItems.SelectedItems.Count > 0)
  122. {
  123. object item = lvSelectedItems.SelectedItems[0];
  124. index = lvSelectedItems.Items.IndexOf(item);
  125. lvSelectedItems.Items.Remove(item);
  126. lvAvailableItems.Items.Add(item);
  127. }
  128. if (index >= lvSelectedItems.Items.Count)
  129. index = lvSelectedItems.Items.Count - 1;
  130. if (index < 0)
  131. index = 0;
  132. if (index < lvSelectedItems.Items.Count)
  133. lvSelectedItems.SelectedIndex = index;
  134. OnFilterChanged();
  135. UpdateButtons();
  136. }
  137. private void btnRemoveItems_Click(object sender, EventArgs e)
  138. {
  139. while (lvSelectedItems.Items.Count > 0)
  140. {
  141. object item = lvSelectedItems.Items[0];
  142. lvSelectedItems.Items.Remove(item);
  143. lvAvailableItems.Items.Add(item);
  144. }
  145. OnFilterChanged();
  146. UpdateButtons();
  147. }
  148. private void lvSelectedItems_SelectedIndexChanged(object sender, EventArgs e)
  149. {
  150. UpdateButtons();
  151. }
  152. private void lvAvailableItems_SelectedIndexChanged(object sender, EventArgs e)
  153. {
  154. UpdateButtons();
  155. }
  156. #endregion
  157. #region Protected Methods
  158. /// <inheritdoc/>
  159. protected override void FillData(DataSourceBase dataSource, Column column)
  160. {
  161. lvAvailableItems.Items.Clear();
  162. lvAvailableItems.Items.AddRange(GetListOfData(dataSource, column));
  163. if (lvAvailableItems.Items.Count > 0)
  164. lvAvailableItems.SelectedIndex = 0;
  165. UpdateButtons();
  166. }
  167. /// <inheritdoc/>
  168. protected override object GetValue()
  169. {
  170. List<string> list = new List<string>();
  171. foreach (object item in lvSelectedItems.Items)
  172. {
  173. list.Add((string)item);
  174. }
  175. return list.ToArray();
  176. }
  177. #endregion
  178. /// <inheritdoc/>
  179. public override void Draw(FRPaintEventArgs e)
  180. {
  181. base.Draw(e);
  182. if (Control.Width > 0 && Control.Height > 0)
  183. {
  184. foreach (Control c in pnPanel.Controls)
  185. {
  186. using (Bitmap bmp = DrawUtils.DrawToBitmap(c, true))
  187. {
  188. e.Graphics.DrawImage(bmp, (int)AbsLeft + c.Left, (int)AbsTop + c.Top);
  189. }
  190. }
  191. }
  192. }
  193. #region Public Methods
  194. /// <inheritdoc/>
  195. public override void Serialize(FRWriter writer)
  196. {
  197. DataSelectorControl c = writer.DiffObject as DataSelectorControl;
  198. base.Serialize(writer);
  199. if (Sorted != c.Sorted)
  200. writer.WriteBool("Sorted", Sorted);
  201. }
  202. #endregion
  203. /// <summary>
  204. /// Initializes a new instance of the <b>DataSelectorControl</b> class with default settings.
  205. /// </summary>
  206. public DataSelectorControl()
  207. {
  208. pnPanel = new Panel();
  209. pnPanel.Resize += new EventHandler(pnPanel_Resize);
  210. lvAvailableItems = new ListBox();
  211. lvAvailableItems.Parent = pnPanel;
  212. lvAvailableItems.IntegralHeight = false;
  213. lvAvailableItems.SelectionMode = SelectionMode.MultiExtended;
  214. lvAvailableItems.SelectedIndexChanged += lvAvailableItems_SelectedIndexChanged;
  215. lvSelectedItems = new ListBox();
  216. lvSelectedItems.Parent = pnPanel;
  217. lvSelectedItems.IntegralHeight = false;
  218. lvSelectedItems.SelectionMode = SelectionMode.MultiExtended;
  219. lvSelectedItems.SelectedIndexChanged += lvSelectedItems_SelectedIndexChanged;
  220. btnAddItem = new Button();
  221. btnAddItem.Parent = pnPanel;
  222. btnAddItem.Text = ">";
  223. btnAddItem.Click += new EventHandler(btnAddItem_Click);
  224. btnAddItems = new Button();
  225. btnAddItems.Parent = pnPanel;
  226. btnAddItems.Text = ">>";
  227. btnAddItems.Click += new EventHandler(btnAddItems_Click);
  228. btnRemoveItem = new Button();
  229. btnRemoveItem.Parent = pnPanel;
  230. btnRemoveItem.Text = "<";
  231. btnRemoveItem.Click += new EventHandler(btnRemoveItem_Click);
  232. btnRemoveItems = new Button();
  233. btnRemoveItems.Parent = pnPanel;
  234. btnRemoveItems.Text = "<<";
  235. btnRemoveItems.Click += new EventHandler(btnRemoveItems_Click);
  236. Control = pnPanel;
  237. UpdateButtons();
  238. UpdateLayout();
  239. }
  240. }
  241. }