1398-05-10 19:43 تعیین سطح دسترسی با treeView
booysusa

 
درود
خسته نباشید مهندس حاجی شریفی گرامی
میخوام برای برنامه سطح دسرسی بزارم از طریق یه فیلم آموزشی که خریداری کردم توضیحاتی بهم داد ولی چون نوع کدنویسی من با اون فیلم تفاوت داشت نتونستم یک تیکشو بنویسم

این تیکه منظورم هست

private void frmRolePermission_Load(object sender, EventArgs e)
{
using (var db = new LoginDBEntities())
{
var parent = db.Permissions.Where(c => c.Parent == 0).ToList();
foreach (var p in parent)
{
TreeNode node = new TreeNode();
node.Name = p.PermissionID.ToString();
node.Text = p.PermissioName;
treeView1.Nodes.Add(node);
AddChildNodes(p.PermissionID, node);
}

cmbRole.DisplayMember = "RoleName";
cmbRole.ValueMember = "RoleID";
cmbRole.DataSource = db.Roles.ToList();
}
}



من از BindingSurce استفاده می کنم ولی توی اون فیلم از ان تی تی فریمورک و برای ارتباط با دیتابیس از دیتاست استفاده کرده بود



من واسه لود از این تیکه کد استفاده میکنم

public void DataRefreshSatheDastresi()
{
bdsSathDastresi.DataSource = new Business.Mojodiatha.clsKarbaran_Semat().ReadSemat();
cmbRole.DisplayMember = "RoleName";
cmbRole.ValueMember = "RoleID";
cmbRole.DataSource = bdsSathDastresi;
}


و این تیکشو DataRefreshSatheDastresi(); در قسمت لود قرار میدم و اطلاعات رو از دیتابیس فراخوانی میکنم


حالا مشکلم اینجاست

using (var db = new LoginDBEntities())
{
var parent = db.Permissions.Where(c => c.Parent == 0).ToList();
foreach (var p in parent)
{
TreeNode node = new TreeNode();
node.Name = p.PermissionID.ToString();
node.Text = p.PermissioName;
treeView1.Nodes.Add(node);
AddChildNodes(p.PermissionID, node);
}
}



مهندس اگر میشه راهنماییم کنید کد رو به روش خودم تبدیل کنم
1398-05-11 21:04
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
من از BindingSurce استفاده می کنم ولی توی اون فیلم از ان تی تی فریمورک و برای ارتباط با دیتابیس از دیتاست استفاده کرده بود

البته EF با BindingSurce تضادی ندارد، مشکل آنجاست که شما خودتان فیلدها و سطرها را دستی از دیتابیس واکشی میکنید که واقعا مشقت بار هم است !

من نمی دانم تابع ReadSemat در کد شما چه چیز را واکشی میکند؟! حتما همان Permissions است، ولی آیا کل Permissions ها است یا فقط Parent = 0 ها است؟!
اگر ReadSemat فقط شامل Parent = 0 ها است که foreach را مستقیم روی همان بزنید.
واگر ReadSemat شامل همه Permissions ها است، پس باید با هر نحوی که از کدخوتان میدانید، فقط Parent = 0 ها را فیلتر کنید و سپس foreach را روی آن دیتای فیلتر شده بزنید.

با مطالبی که گفتید در همین حد میتوانم پیشنهاد بدهم.

public void  DataRefreshSatheDastresi()
{
var permissions = new Business.Mojodiatha.clsKarbaran_Semat().ReadSemat();
bdsSathDastresi.DataSource = permissions;

//... any code ...

var parents = permissions.Where(c => c.Parent == 0).ToList();
foreach (var p in parents)
{
TreeNode node = new TreeNode();
node.Name = p.PermissionID.ToString();
node.Text = p.PermissioName;
treeView1.Nodes.Add(node);
AddChildNodes(p.PermissionID, node);
}

//... any code ...
cmbRole.DisplayMember = "RoleName";
cmbRole.ValueMember = "RoleID";
cmbRole.DataSource = bdsSathDastresi;

}


موفق باشید.
1398-05-12 19:32
booysusa

 
با درود خدمت شما مهندس حاجی شریفی گرامی
نقل قول
البته EF با BindingSurce تضادی ندارد، مشکل آنجاست که شما خودتان فیلدها و سطرها را دستی از دیتابیس واکشی میکنید که واقعا مشقت بار هم است !

بله فعلا روش من این هست (ولی عادت کردم)


نقل قول
من نمی دانم تابع ReadSemat در کد شما چه چیز را واکشی میکند؟! حتما همان Permissions است، ولی آیا کل Permissions ها است یا فقط Parent = 0 ها است؟!

کد ReadSemat من اطلاعات زیر را واکشی میکنه:
public List<clsKarbaran_Semat> ReadSemat()
{
string command = "Select * from tblUser_Role";
var db = new DataAccess.DatabaseManager();
var result = db.GetData(command);

List<clsKarbaran_Semat> lstResult = new List<clsKarbaran_Semat>();
foreach (DataRow r in result.Rows)
{
clsKarbaran_Semat clskarbaran_semat = new clsKarbaran_Semat();
clskarbaran_semat.RoleID = Convert.ToInt64(r["RoleID"]);
clskarbaran_semat.RoleName = r["RoleName"].ToString();
lstResult.Add(clskarbaran_semat);
}
return lstResult;
}



این فایل پروژه هست که خریدش کردم ولی باید کدهاش تبدیل بشه به نوع کدهای من، من با این فرم مشکل دارم (frmRolePermission.cs ) - شما بزرگوار میدونید من چطوری کد میزنم
لینک دانلود
1398-05-14 00:22
حاجی شریفی
مؤسس سایت
 
سلام
شرمنده ام، آنقدر فرصت ندارم که بخواهم کل EF را مجدد باز نویسی کنم

کد خواندن (فقط یک) جدول Permission را بدون EF برایتان نوشتم .

public class  PermissionRow
{
public int PermissionID ;
public string PermissioName ;
public int ? Parent ;
}

private IList<PermissionRow> Read_NO_EF(string sqlWhere)
{
string CS = System.Configuration.ConfigurationManager.ConnectionStrings["AAA"].ConnectionString ;
string SQL = "SELECT [PermissionID], [PermissioName], [Parent] FROM [Permission] " + sqlWhere ;

var list = new List<PermissionRow>();
using (var dbCon = new System.Data.SqlClient.SqlConnection(CS))
using (var dbCom = new System.Data.SqlClient.SqlCommand(SQL, dbCon))
{
dbCon.Open() ;
using (var dr = dbCom.ExecuteReader())
{
while (dr.Read())
{
var row = new PermissionRow() ;
row.PermissionID = dr.GetInt32(0) ;
row.PermissioName = (!dr.IsDBNull(1)) ? dr.GetString(1) : null ;
row.Parent = (!dr.IsDBNull(2)) ? (int ?)dr.GetInt32(2) : null ;
list.Add(row) ;
}
}
}
return list;
}

public void AddChildNodes(int parent, TreeNode node)
{
var child = this .Read_NO_EF(string .Format("WHERE [Parent] = {0}", parent)) ;
foreach (var c in child)
{
TreeNode childNode = new TreeNode() ;
childNode.Name = c.PermissionID.ToString() ;
childNode.Text = c.PermissioName ;
node.Nodes.Add(childNode) ;
AddChildNodes(c.PermissionID, childNode) ;
}
}


خودتان میتوانید خواندن از بقیه جداول را هم ممانند نمونه فوق ، کد بزنید.

اگر از EF استفاده نمیکنید، حداقل حداقل از Dapper استفاده کنید، خیلی کدتان را کاهش خواهد داد و برای افزودن/حذف یک فیلد به/از دیتابیس مجبور نخواهید بود، کل کدها را بازنگری کنید و... و...

دانلود سورس تصحیح شده 72KB

موفق باشید.
1398-05-14 19:19
booysusa

 
درود مهندس
اینارو کجا باید بزارم تو خود فرم frmRolePermission

public class PermissionRow
{
public int PermissionID ;
public string PermissioName ;
public int ? Parent ;
}

private IList<PermissionRow> Read_NO_EF(string sqlWhere)
{
string CS = System.Configuration.ConfigurationManager.ConnectionStrings["AAA"].ConnectionString ;
string SQL = "SELECT [PermissionID], [PermissioName], [Parent] FROM [Permission] " + sqlWhere ;

var list = new List<PermissionRow>();
using (var dbCon = new System.Data.SqlClient.SqlConnection(CS))
using (var dbCom = new System.Data.SqlClient.SqlCommand(SQL, dbCon))
{
dbCon.Open() ;
using (var dr = dbCom.ExecuteReader())
{
while (dr.Read())
{
var row = new PermissionRow() ;
row.PermissionID = dr.GetInt32(0) ;
row.PermissioName = (!dr.IsDBNull(1)) ? dr.GetString(1) : null ;
row.Parent = (!dr.IsDBNull(2)) ? (int ?)dr.GetInt32(2) : null ;
list.Add(row) ;
}
}
}
return list;
}

public void AddChildNodes(int parent, TreeNode node)
{
var child = this .Read_NO_EF(string .Format("WHERE [Parent] = {0}", parent)) ;
foreach (var c in child)
{
TreeNode childNode = new TreeNode() ;
childNode.Name = c.PermissionID.ToString() ;
childNode.Text = c.PermissioName ;
node.Nodes.Add(childNode) ;
AddChildNodes(c.PermissionID, childNode) ;
}
}


این خط برای من خطا میده

نقل قول
string CS = System.Configuration.ConfigurationManager.ConnectionStrings["AAA"].ConnectionString ;

تصویر خطا
1398-05-14 23:43
حاجی شریفی
مؤسس سایت
 
سلام
در انتهای پست قبلی ، سورس کامل را برایتان قرار دادم.

درضمن برای استفاده از System.Configuration.ConfigurationManager.ConnectionStrings باید کتابخانه System.Configuration را Add-Reference کنید
و ارجاعی با نام AAA در app.config اضافه کنید.
سورس کامل را از انتهای پست قبلی دانلود و مشاهده کنید.
موفق باشید.