PDA

View Full Version : حرفه ای: اطلاعات جدول در صورت وجود در TREEVIEW نود مربوطه تیک بخورد



حسین.کاظمی
جمعه 29 اردیبهشت 1396, 20:09 عصر
با سلام به همه دوستان


دوتا جدول دارم در یکیش ی سری اطلاعات درونش است و جدول دیگری که آیتم های آن به انتخاب کاربر از بین جدول اولی انتخاب شده را درون جدول دومی ریخته میشه+شماره شناسایی مشتری......
حالا میخام توی برنامه وقتی بروی نام مشتری که درون دیتا گرید است کلیک بشه براساس شماره شناسایی مشتری، آیتم هایی که درون جدول دومی می باشد را درtreeview تیک بزند....(treeview ازجدول اولی پر شده) .....

ساختارجدول بصورت عکس زیر است.....

145265


یک پروژه قبلا داشتم برای حق دسترسی بود دقیقا همین کارا میکرد و از کدهای اونم استفاده کردم(کدهای زیر)ولی عمل نمیکنه و خطای خالی بودن پارامترها را میده.....


void UserPermissions(int userID)
{
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = _ConnectionString;
OleDbCommand command =new OleDbCommand(@"SELECT * FROM tbl_Users_Persmissions WHERE id_user=@UserID AND permissionID=@PermissionID", connection);
command.Parameters.Add(new OleDbParameter("@UserID", 0));
command.Parameters.Add(new OleDbParameter("@PermissionID",0));
connection.Open();

foreach (TreeNode node in TREENODE.NODES)
{
command.Parameters["@UserID"].Value = userID;
command.Parameters["@PermissionID"].Value = node;
using (OleDbDataReader dr = command.ExecuteReader())
{
if (dr.HasRows)
{
node.Checked = true;
}
}


foreach (TreeNode childNode in node.Parent.Parent.Nodes)
{
command.Parameters["@UserID"].Value = userID;
command.Parameters["@PermissionID"].Value = childNode;
using (OleDbDataReader dr = command.ExecuteReader())
{
if (dr.HasRows)
{
childNode.Checked = true;
}
}
}




}
connection.Close();
}




نیاز به راهنمایی هاتون دارم..

ممنون از همگی

Mahmoud.Afrad
جمعه 29 اردیبهشت 1396, 20:22 عصر
شما به ازای هر نود یک بار کوئری میزنید؟! درسته؟ و چطور treeview را پر میکنید؟

حسین.کاظمی
شنبه 30 اردیبهشت 1396, 07:35 صبح
به ازای هرcid که parentid آن 0باشد یک کوئری میزنم ومیریزم توی datatable و ستون دیتا تیبل را میریزم توی نود تعریف شده.....و همین کار را برای parentid هایی که برابر با cdi است باز ی کوئری میزنم ومیریزم توی دیتا تیبل و مجدد ستون دیتاتیبل را در نود تعریف شده میریزم..

Mahmoud.Afrad
شنبه 30 اردیبهشت 1396, 16:53 عصر
کد پر کردن treeview رو نزاشتید که بتونم کمک کنم.
اما بدونید که پراپرتی Nodes از treeview (نوع TreeNodeCollection) متدی به نام Find داره که برای پیدا کردن گره میشه ازش استفاده کرد. برای استفاده از این متد نیاز به یک کلید (Key) دارید که همان مشخصه Name از TreeNode هست.
در زمان ایجاد گره(پر کردن treeview) ، اطلاعات رو از جدول دریافت و CID رو به Name و Title رو به Text گره نسبت بدید.(برای پر کردن treeview یک کوئری کافیست)

متد UserPermissions را به اینصورت اصلاح کنید که فقط یک کوئری روی جدول بزنید و تمام CIDهایی را که برای شخص مورد نظر هست بدست بیارید و در یک دیتاتیبل بریزید. روی سطرهای دیتاتیبل پیمایش کنید و به ازای هر CID متد Find رو استفاده کنید و گره رو بدست بیارید و تیک بزنید.

حسین.کاظمی
شنبه 30 اردیبهشت 1396, 17:21 عصر
سلام مجدد
ببخشید من صبح به سیستم دسترسی نداشتم .......
کدهای مربوط به پرکردن treeview


TreeNode nodParent,nodChild,nodSubchild;
DataTable dt_parent, dt_Child,dt_subchild;
dt_parent = db.dataTableSelect(@"SELECT * FROM tbl_Permisstions WHERE ParentId=0" );
for(int i=0;i < dt_parent.Rows.Count;i++)
{
nodParent = new TreeNode(dt_parent.Rows[i][0].ToString()+"-"+ dt_parent.Rows[i][1].ToString());
dt_Child = db.dataTableSelect(@"SELECT * FROM tbl_Permisstions WHERE ParentId=" + dt_parent.Rows[i][0]);


for (int j = 0; j < dt_Child.Rows.Count; j++)
{
nodChild = new TreeNode(dt_Child.Rows[j][0].ToString() + "-" + dt_Child.Rows[j][1].ToString());
nodParent.Nodes.Add(nodChild);


dt_subchild = db.dataTableSelect(@"SELECT * FROM tbl_Permisstions WHERE ParentId=" + dt_Child.Rows[j][0]);
for (int s = 0; s < dt_subchild.Rows.Count; s++)
{
nodSubchild = new TreeNode(dt_subchild.Rows[s][0].ToString() + "-" + dt_subchild.Rows[s][1].ToString());
nodChild.Nodes.Add(nodSubchild);
}
}
treeView1.Nodes.Add(nodParent);
}

حسین.کاظمی
شنبه 30 اردیبهشت 1396, 19:04 عصر
کد
پرکردن treeview را اینجوری اصلاح کردم....

dt_parent = db.dataTableSelect(@"SELECT * FROM tbl_Permisstions WHERE ParentId=0");
nodParent = new TreeNode();
for (int i = 0; i < dt_parent.Rows.Count; i++)
{
nodParent.Name = dt_parent.Rows[i][0].ToString();
nodParent.Text = dt_parent.Rows[i][1].ToString();
nodParent = new TreeNode(dt_parent.Rows[i][0].ToString() + "-" + dt_parent.Rows[i][1].ToString());
dt_Child = db.dataTableSelect(@"SELECT * FROM tbl_Permisstions WHERE ParentId=" + dt_parent.Rows[i][0]);


for (int j = 0; j < dt_Child.Rows.Count; j++)
{

nodChild = new TreeNode(dt_Child.Rows[j][0].ToString() + "-" + dt_Child.Rows[j][1].ToString());
nodParent.Nodes.Add(nodChild);


dt_subchild = db.dataTableSelect(@"SELECT * FROM tbl_Permisstions WHERE ParentId=" + dt_Child.Rows[j][0]);
for (int s = 0; s < dt_subchild.Rows.Count; s++)
{
nodSubchild = new TreeNode(dt_subchild.Rows[s][0].ToString() + "-" + dt_subchild.Rows[s][1].ToString());
nodChild.Nodes.Add(nodSubchild);
}
}
treeView1.Nodes.Add(nodParent);
}

و متد userpermission را هم طبق گفته هاتون؛بسری هاشو فهمیدم نوشتم ولی key را نمیدونم چی بنویسم


DataTable dt = db.dataTableSelect(@"SELECT permissionID FROM tbl_Users_Persmissions WHERE id_user=" + userID);
foreach (DataRow rr in dt.Rows)
{
treeView1.Nodes.Find(؟؟؟, true);
}

این کدهام،محبت میکنید چک کنید ببینید درسته یا نه؟




ممنون

Mahmoud.Afrad
شنبه 30 اردیبهشت 1396, 20:04 عصر
فرض:
جدولی به نام tbl_Permisstions با ستونهای PermissionId و Title و ParentId
و tbl_Users_Permissions با ستونهای id و PermissionId و UserId

کد پر کردن treeview رو به اینصورت اصلاح کنید (کوئری را برحسب parentId به صورت صعودی مرتب کنید و به ترتیب شروع به ساخت گره ها کنید)
DataTable allPermissions = db.dataTableSelect(
@"select PermissionId, Title, ParentId
from tbl_Permisstions
where ParentId = 0 OR ParentId in (select PermissionId from tbl_Permisstions)
order by ParentId");

for (var i = 0; i < allPermissions.Rows.Count; i++)
{
DataRow dtRow = allPermissions.Rows[i];
string permissionId = Convert.ToString(dtRow["PermissionId"]);
string permissionTitle = Convert.ToString(dtRow["Title"]);
string permissionParentId = Convert.ToString(dtRow["ParentId"]);

TreeNode node = new TreeNode
{
Text = permissionTitle,
Name = permissionId
};

if (permissionParentId == "0")
{
treeView1.Nodes.Add(node);
}
else
{
TreeNode[] parentNodes = treeView1.Nodes.Find(permissionParentId, true);
if (parentNodes.Length > 0)
{
parentNodes[0].Nodes.Add(node);
}
}
}

برای تیک زدن سطح دسترسی هر شخص به صورت زیر
DataTable dt = db.dataTableSelect(@"SELECT permissionID FROM tbl_Users_Persmissions WHERE id_user=" + userID);
foreach (DataRow row in dt.Rows)
{
string permissionID = Convert.ToString(row["permissionID"]);
TreeNode[] nodes = treeView1.Nodes.Find(permissionID, true);
if (nodes.Length > 0)
{
nodes[0].Checked = true;
}
}