You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

378 lines
13 KiB

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OnDoc.Klassen;
using Syncfusion.Windows.Forms.Tools.MultiColumnTreeView;
using System.Reflection;
using System.Xml.Linq;
using System.Drawing.Imaging;
using Database;
using OnDoc.UIControls;
namespace OnDoc.UICintrols
{
public partial class PartnerTree : UserControl
{
public delegate void StrukturHandler(object myObject, StrukturArgs myArgs);
public event StrukturHandler OnStrukturClicked;
public class treeclass
{
public int dokumentartnr { get; set; }
public string bezeichnung { get; set; }
public int imageindex { get; set; }
public int imageindexopen { get; set; }
public int parentid { get; set; }
public int sort { get; set; }
}
private int partnernr;
public int PartnerNr
{
get => partnernr;
set {
partnernr = value;
Update_Tree();
}
}
public int mitarbeiternr { get; set; }
public int profilnr {get;set;}
public PartnerTree()
{
InitializeComponent();
this.ImageList3.Images.Clear();
for (int i = 0; i < 75; i++)
{
string iname = @"X:\Imagelist\Relaunche\" + i.ToString() + ".png";
if (System.IO.File.Exists(iname))
{
ImageList3.Images.Add(Image.FromFile(iname));
}
else
{
iname = @"X:\Imagelist\Relaunche\1.png";
ImageList3.Images.Add(Image.FromFile(iname));
}
}
}
public void Refresh(int partnernr, int mitarbeiternr, int profilnr)
{
this.partnernr = partnernr;
this.mitarbeiternr = mitarbeiternr;
this.profilnr = profilnr;
Update_Tree();
}
private bool Update_Tree(TreeNode root = null)
{
try
{
treeView1.BeginUpdate();
Cursor = Cursors.WaitCursor;
if (root == null) { this.treeView1.Nodes.Clear(); }
if (this.partnernr == 0) return false;
DataTable treedata = new DataTable();
DataTable partnerdata = new DataTable();
DataTable rootdata = new DataTable();
DB db = new DB(AppParams.connectionstring);
rootdata = db.Get_Partnerstruktur(PartnerNr, true, mitarbeiternr, profilnr);
TreeNode partnernode = new TreeNode();
TreeNode foundnode = new TreeNode();
foreach (DataRow dr in rootdata.Rows)
{
foundnode = SearchTreeView(dr["Person"].ToString(), treeView1.Nodes);
if (foundnode == null)
{
foundnode = new TreeNode();
foundnode.Text = dr["Person"].ToString();
foundnode.Tag = dr["person_nrpar00"].ToString();
foundnode.ImageIndex = Convert.ToInt32(dr["person_imageindex"].ToString());
foundnode.SelectedImageIndex = Convert.ToInt32(dr["person_imageindexopen"].ToString());
Font boldFont = new Font(treeView1.Font, FontStyle.Bold);
foundnode.NodeFont = boldFont;
treeView1.Nodes.Add(foundnode);
if (rootdata.Rows.Count > 59000)
{
foundnode.Nodes.Add(new TreeNode("Dummy"));
}
else
{
partnerdata = db.Get_Partnerstruktur(Convert.ToInt32(dr["Person_nrpar00"].ToString()), false, mitarbeiternr, profilnr);
foreach (DataRow drp in partnerdata.Rows)
{
if (Convert.ToInt32(drp["parentid"].ToString()) == 2) { drp["parentid"] = dr["person_nrpar00"].ToString(); };
if (Convert.ToInt32(drp["parentid"].ToString()) < 2) { drp.Delete(); };
}
partnerdata.AcceptChanges();
List<DataRow> list1 = treedata.AsEnumerable().ToList();
List<treeclass> tree1 = new List<treeclass>();
tree1 = ConvertDataTable<treeclass>(partnerdata);
PopulateTree(ref foundnode, tree1);
}
}
partnernode = new TreeNode();
partnernode.Text = dr["Partner"].ToString();
partnernode.Tag = dr["nrpar00"].ToString();
partnernode.ImageIndex = Convert.ToInt32(dr["imageindex"].ToString());
partnernode.SelectedImageIndex = Convert.ToInt32(dr["imageindexopen"].ToString());
Font boldFont1 = new Font(treeView1.Font, FontStyle.Bold);
partnernode.NodeFont = boldFont1;
foundnode.Nodes.Add(partnernode);
if (rootdata.Rows.Count > 50)
{
partnernode.Nodes.Add(new TreeNode("Dummy"));
}
else
{
treedata = db.Get_Partnerstruktur(Convert.ToInt32(dr["nrpar00"].ToString()), false, mitarbeiternr, profilnr);
foreach (DataRow drp in treedata.Rows)
{
if (Convert.ToInt32(drp["parentid"].ToString()) == 2) { drp["parentid"] = dr["nrpar00"].ToString(); };
if (Convert.ToInt32(drp["parentid"].ToString()) < 2) { drp.Delete(); };
}
treedata.AcceptChanges();
List<DataRow> list = treedata.AsEnumerable().ToList();
List<treeclass> tree = new List<treeclass>();
tree = ConvertDataTable<treeclass>(treedata);
PopulateTree(ref partnernode, tree);
}
}
try
{
if (rootdata.Rows.Count == 1)
{
if (ignore != true) { treeView1.ExpandAll(); }
}
treeView1.SelectedNode = treeView1.Nodes[0];
treeView1.SelectedNode.EnsureVisible();
}
catch { }
treeView1.EndUpdate();
Cursor = Cursors.Default;
return true;
}
catch
{
treeView1.EndUpdate();
Cursor = Cursors.Default;
return false;
}
}
private TreeNode SearchTreeView(string p_sSearchTerm, TreeNodeCollection p_Nodes)
{
foreach (TreeNode node in p_Nodes)
{
if (node.Text == p_sSearchTerm)
return node;
if (node.Nodes.Count > 0)
{
TreeNode child = SearchTreeView(p_sSearchTerm, node.Nodes);
if (child != null) return child;
}
}
return null;
}
public void PopulateTree(ref TreeNode root, List<treeclass> eintraege)
{
if (root == null)
{
root = new TreeNode();
root.Text = "";
root.Tag = null;
// get all departments in the list with parent is null
var details = eintraege.Where(t => t.parentid == null);
foreach (var detail in details)
{
var child = new TreeNode()
{
Text = detail.bezeichnung,
Tag = detail.dokumentartnr.ToString(),
ImageIndex = detail.imageindex,
SelectedImageIndex = detail.imageindex,
};
PopulateTree(ref child, eintraege);
root.Nodes.Add(child);
}
}
else
{
//var id = (int)root.Tag;
int id = Convert.ToInt32(root.Tag.ToString());
var details = eintraege.Where(t => t.parentid == id);
foreach (var detail in details)
{
var child = new TreeNode()
{
Text = detail.bezeichnung,
Tag = detail.dokumentartnr,
ImageIndex = detail.imageindex,
SelectedImageIndex = detail.imageindex,
};
PopulateTree(ref child, eintraege);
root.Nodes.Add(child);
}
}
}
private static List<T> ConvertDataTable<T>(DataTable dt)
{
List<T> data = new List<T>();
foreach (DataRow row in dt.Rows)
{
T item = GetItem<T>(row);
data.Add(item);
}
return data;
}
private static T GetItem<T>(DataRow dr)
{
Type temp = typeof(T);
T obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (PropertyInfo pro in temp.GetProperties())
{
if (pro.Name == column.ColumnName)
pro.SetValue(obj, dr[column.ColumnName], null);
else
continue;
}
}
return obj;
}
private void tsbtnPartnerSearch_Click(object sender, EventArgs e)
{
try
{
this.PartnerNr = Convert.ToInt32(this.txtPartnerNr.Text);
}
catch
{
this.txtPartnerNr.Text = "";
}
}
private void txtPartnerNr_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
tsbtnPartnerSearch_Click(sender, e);
}
}
bool ignore = false;
private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
{
if (ignore) return;
if (e.Node.Nodes.Count < 2)
{
partnernr = Convert.ToInt32(e.Node.Tag);
//e.Node.Nodes.Clear();
ignore=true;
Update_Tree(e.Node);
e.Node.ExpandAll();
ignore = false;
}
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (this.tschkShowImgID.Checked)
{
MessageBox.Show(e.Node.ImageIndex.ToString());
}
int Pnr = 0;
if (e.Node.Level<2) {
Pnr = Convert.ToInt32(e.Node.Tag);
}
else
{
Pnr = ReadRecursive(e.Node);
}
StrukturArgs myArgs = new StrukturArgs("",Convert.ToInt32(e.Node.Tag.ToString()),Pnr);
OnStrukturClicked(this, myArgs);
}
private int ReadRecursive(TreeNode node)
{
TreeNode tmpnode = node;
while ( tmpnode.Level>1)
{
tmpnode = tmpnode.Parent;
}
if (tmpnode.Text.ToString().IndexOf(" - ") < 3)
{
while (tmpnode.Level > 0)
{
tmpnode = tmpnode.Parent;
}
}
return Convert.ToInt32(tmpnode.Tag);
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
}
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
private void toolStripLabel1_Click(object sender, EventArgs e)
{
}
private void tsbtnPartnerSuche_Click(object sender, EventArgs e)
{
Partnersuche partnersuche = new Partnersuche();
partnersuche.ShowDialog();
if (partnersuche.DialogResult == DialogResult.OK)
{
if (partnersuche.partnernr != 0)
{ this.partnernr = partnersuche.partnernr; Update_Tree(); }
}
}
}
}