2021-07-18PX Added Member CSV export feature
This commit is contained in:
parent
7d2cd49d76
commit
342511f03a
|
@ -210,6 +210,8 @@
|
||||||
<Compile Include="core\MvFinishProcess.cs" />
|
<Compile Include="core\MvFinishProcess.cs" />
|
||||||
<Compile Include="view\LvAttachments.cs" />
|
<Compile Include="view\LvAttachments.cs" />
|
||||||
<Compile Include="model\IAttachmentOwner.cs" />
|
<Compile Include="model\IAttachmentOwner.cs" />
|
||||||
|
<Compile Include="view\frmExportCsv.cs" />
|
||||||
|
<Compile Include="view\LvSelectFields.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config" />
|
<None Include="App.config" />
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace dezentrale.model
|
||||||
[XmlElement("MvInvitationsListColumn")]
|
[XmlElement("MvInvitationsListColumn")]
|
||||||
public List<ConfigLVColumn> MvInvitationsListColumns{ get; set; } = new List<ConfigLVColumn>();
|
public List<ConfigLVColumn> MvInvitationsListColumns{ get; set; } = new List<ConfigLVColumn>();
|
||||||
[XmlElement("AttachmentsColumn")]public List<ConfigLVColumn> AttachmentsColumns{ get; set; } = new List<ConfigLVColumn>();
|
[XmlElement("AttachmentsColumn")]public List<ConfigLVColumn> AttachmentsColumns{ get; set; } = new List<ConfigLVColumn>();
|
||||||
|
[XmlElement("SelectFieldsColumn")]public List<ConfigLVColumn> SelectFieldsColumns{ get; set; } = new List<ConfigLVColumn>();
|
||||||
|
|
||||||
[XmlElement] public List<KeyValue> MoneyTransferRegEx { get; set; } = new List<KeyValue>(); //This doesn't belong here! Move to new file within db-data!
|
[XmlElement] public List<KeyValue> MoneyTransferRegEx { get; set; } = new List<KeyValue>(); //This doesn't belong here! Move to new file within db-data!
|
||||||
[XmlElement] public DateTime LastCronjobRun { get; set; } = DateTime.Now; //This doesn't belong here! Move to new file within db-data!
|
[XmlElement] public DateTime LastCronjobRun { get; set; } = DateTime.Now; //This doesn't belong here! Move to new file within db-data!
|
||||||
|
|
|
@ -81,7 +81,9 @@ namespace dezentrale.model
|
||||||
List<string> line = FileContents[l];
|
List<string> line = FileContents[l];
|
||||||
for (int f = 0; f < line.Count; f++)
|
for (int f = 0; f < line.Count; f++)
|
||||||
{
|
{
|
||||||
sb.Append("\"" + line[f].Replace("\"", "\"\"") + "\"");
|
string s = line[f];
|
||||||
|
if (s == null) s = "null";
|
||||||
|
sb.Append("\"" + s.Replace("\"", "\"\"") + "\"");
|
||||||
if (f < line.Count - 1) sb.Append(FieldSeparator);
|
if (f < line.Count - 1) sb.Append(FieldSeparator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,13 @@ namespace dezentrale.view
|
||||||
{
|
{
|
||||||
if (this.SelectedItems.Count < 1) return null;
|
if (this.SelectedItems.Count < 1) return null;
|
||||||
return (T)this.SelectedItems[0].Tag;
|
return (T)this.SelectedItems[0].Tag;
|
||||||
|
}
|
||||||
|
public List<T> GetAllItems()
|
||||||
|
{
|
||||||
|
List<T> ret = new List<T>();
|
||||||
|
for (int i = 0; i < this.Items.Count; i++)
|
||||||
|
ret.Add((T)this.Items[i].Tag);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
public List<T> GetSelectedItems()
|
public List<T> GetSelectedItems()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
using dezentrale.model;
|
||||||
|
|
||||||
|
namespace dezentrale.view
|
||||||
|
{
|
||||||
|
public class LvSelectFields : CustomListView<string>
|
||||||
|
{
|
||||||
|
protected override List<ConfigLVDataHandler> DefaultColumns
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new List<ConfigLVDataHandler>()
|
||||||
|
{
|
||||||
|
new ConfigLVDataHandler()
|
||||||
|
{
|
||||||
|
Name = "field",
|
||||||
|
Display = "field",
|
||||||
|
Width = 120,
|
||||||
|
CustomToString = x => ((string)x),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public LvSelectFields() : base(Program.config.SelectFieldsColumns, LvSelectFields_ColumnsChanged)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void LvSelectFields_ColumnsChanged(object sender, ColumnsChangedArgs e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("LvSelectFields_ColumnsChanged");
|
||||||
|
Program.config.SelectFieldsColumns.Clear();
|
||||||
|
foreach (ConfigLVDataHandler c in e.Columns) Program.config.SelectFieldsColumns.Add(new ConfigLVColumn(c));
|
||||||
|
XmlData.SaveToFile(Program.ConfigFile, Program.config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using dezentrale.model;
|
||||||
|
|
||||||
|
namespace dezentrale.view
|
||||||
|
{
|
||||||
|
public class frmExportCsv<T> : FormWithActionButtons
|
||||||
|
{
|
||||||
|
private List<T> list;
|
||||||
|
private LvSelectFields lv;
|
||||||
|
|
||||||
|
private bool ExportCsv(List<string> properties)
|
||||||
|
{
|
||||||
|
SaveFileDialog sfd = new SaveFileDialog(){
|
||||||
|
FileName = $"{typeof(T)}_{list.Count}_items.csv",
|
||||||
|
Filter = "Comma-Separated-Value files (*.csv)|*.csv"
|
||||||
|
};
|
||||||
|
DialogResult dr = sfd.ShowDialog();
|
||||||
|
if (dr != DialogResult.OK)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CsvFile csv = new CsvFile() {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//Build headline
|
||||||
|
csv.FileContents.Add(properties);
|
||||||
|
|
||||||
|
foreach (T t in list)
|
||||||
|
{
|
||||||
|
List<string> t_csv = new List<string>();
|
||||||
|
foreach (string p in properties)
|
||||||
|
{
|
||||||
|
//Get propertyinfo from T
|
||||||
|
PropertyInfo pi = typeof(T).GetProperty(p);
|
||||||
|
if (!pi.CanRead) continue;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
object o = pi.GetValue(t, null);
|
||||||
|
string propVal = (o == null ? "null" : o.ToString());
|
||||||
|
t_csv.Add(propVal);
|
||||||
|
} catch(Exception ex)
|
||||||
|
{
|
||||||
|
t_csv.Add(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
csv.FileContents.Add(t_csv);
|
||||||
|
}
|
||||||
|
csv.SaveFile(sfd.FileName);
|
||||||
|
} catch(Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show($"Error({ex.GetType()}):\r\n{ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
private void BuildGui()
|
||||||
|
{
|
||||||
|
this.Text = $"Export {list.Count} of \"{typeof(T).ToString()}\"";
|
||||||
|
|
||||||
|
this.Controls.Add(lv = new LvSelectFields()
|
||||||
|
{
|
||||||
|
Left = 0,
|
||||||
|
Width = this.ClientSize.Width,
|
||||||
|
Top = 0,
|
||||||
|
Height = this.ClientSize.Height - 60,
|
||||||
|
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right,
|
||||||
|
});
|
||||||
|
|
||||||
|
foreach (var p in typeof(T).GetProperties())
|
||||||
|
{
|
||||||
|
lv.AddEntry(p.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.AddButton("All fields", (sender, e) => {
|
||||||
|
List<string> all = lv.GetAllItems();
|
||||||
|
if (ExportCsv(all)) this.Close();
|
||||||
|
});
|
||||||
|
this.AddButton("Selected fields", (sender, e) => {
|
||||||
|
List<string> selected = lv.GetSelectedItems();
|
||||||
|
if (ExportCsv(selected)) this.Close();
|
||||||
|
});
|
||||||
|
this.AddButton("Cancel", (sender, e) => { this.Close(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
public frmExportCsv(T t)
|
||||||
|
{
|
||||||
|
list = new List<T> { t };
|
||||||
|
BuildGui();
|
||||||
|
}
|
||||||
|
public frmExportCsv(List<T> l)
|
||||||
|
{
|
||||||
|
list = l;
|
||||||
|
BuildGui();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -65,7 +65,9 @@ namespace dezentrale.view
|
||||||
new MenuItem("Generate &Testdata", mnuMain_Members_Generate_Testdata),
|
new MenuItem("Generate &Testdata", mnuMain_Members_Generate_Testdata),
|
||||||
new MenuItem("-"),
|
new MenuItem("-"),
|
||||||
#endif
|
#endif
|
||||||
new MenuItem("Show numeric &info", lstMembers_mnuMain_Members_ShowInfo),
|
new MenuItem("Show numeric &info", lstMembers_mnuMain_Members_ShowInfo),
|
||||||
|
new MenuItem("Export &CSV (selected)", lstMembers_mnuMain_Members_CSV_selected),
|
||||||
|
new MenuItem("Export &CSV (all)", lstMembers_mnuMain_Members_CSV_all),
|
||||||
} },
|
} },
|
||||||
new MenuItem("MV")
|
new MenuItem("MV")
|
||||||
{ MenuItems = {
|
{ MenuItems = {
|
||||||
|
@ -395,6 +397,16 @@ namespace dezentrale.view
|
||||||
{
|
{
|
||||||
MessageBox.Show(new MemberReport().Body);
|
MessageBox.Show(new MemberReport().Body);
|
||||||
}
|
}
|
||||||
|
private void lstMembers_mnuMain_Members_CSV_selected(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
frmExportCsv<Member> frmCsv = new frmExportCsv<Member>(lstMembers.GetSelectedItems());
|
||||||
|
frmCsv.ShowDialog();
|
||||||
|
}
|
||||||
|
private void lstMembers_mnuMain_Members_CSV_all(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
frmExportCsv<Member> frmCsv = new frmExportCsv<Member>(Program.members.Entries);
|
||||||
|
frmCsv.ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
private void mnuMain_Payments_Add(object sender, EventArgs e)
|
private void mnuMain_Payments_Add(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue