PDA

View Full Version : حرفه ای: ارتباط LINQ و DATASORCEBINDING



ja_latifian
شنبه 06 بهمن 1397, 16:48 عصر
سلام
ممنون میشم راهنمایی بفرمایید دوستان
من در پروژه ام از LINQ استفاده می کنم و برای اینکه در datagridview نمایش بدهم ابتدا اون را به datasource یک binding source نسبت می دهم و بعدش اون binding source را بعنوان datasource گرید ویو قرار می دهم ولی در این حالت فیلتر binding source کار نمی کند و هیچ خروجی ندارد آیا بجز اینکه در linq از where استفاده کنم راه دیگری هم وجود داره؟

alexmcse
یک شنبه 07 بهمن 1397, 16:42 عصر
سلام
ممنون میشم راهنمایی بفرمایید دوستان
من در پروژه ام از LINQ استفاده می کنم و برای اینکه در datagridview نمایش بدهم ابتدا اون را به datasource یک binding source نسبت می دهم و بعدش اون binding source را بعنوان datasource گرید ویو قرار می دهم ولی در این حالت فیلتر binding source کار نمی کند و هیچ خروجی ندارد آیا بجز اینکه در linq از where استفاده کنم راه دیگری هم وجود داره؟

بله میشود

BindingSource b; public Form8()
{

InitializeComponent();


b=Disp("Ali");


dataGridView1.DataSource = b;




}


private BindingSource Disp(string name)
{//کانکشن استرینگ و دستورات اس کیو ال را تغییر دهید



var cnn = new SqlConnection("Data Source=.;Initial Catalog=DBExample;Integrated Security=True");
var cmd = new SqlCommand("select * from TInfo", cnn);


var da = new SqlDataAdapter(cmd);
var dt = new DataTable();
da.Fill(dt);
var bs = new BindingSource
{
DataSource = dt,


// Filter = $"نام ستون جدول شما = '{name}'"
Filter = $"Name = '{name}'" //خذف شود
};
return bs;
}






private void button1_Click(object sender, EventArgs e)
{//این کد فیلتر بیندینگ سورس را پاک میکند
b.RemoveFilter();
}

ja_latifian
دوشنبه 08 بهمن 1397, 16:12 عصر
سلام و تشکر از وقتی که گذاشتید
ولی من میخوام خودم را درگیر dataadapter و dataTable و اینها نکنم برای همین از LINQ استفاده کردم
چون اگه می خواستم از این ابزارها استفاده کنم مثل سابق از dataset استفاده می کردم و در کنارش از همین ابزارها
شما در اصل اومدین صورت مسئله را عوض کردید و به جای LINQ از dataTable استفاده کردید
مسئله اینه که وقتی bindingSource را با LINQ ارتباط می دیم فیلترش کار نمیکنه آیا امکانش هست با همین شرایط موجود فیلتر کرد ؟
باز هم تشکر

Shadow_net
دوشنبه 08 بهمن 1397, 16:34 عصر
خب کد linq رو برابر datagrid قرار بدید چرا binding source ؟
برای جستجو هم از linq استفاده کنید

alexmcse
دوشنبه 08 بهمن 1397, 18:11 عصر
سلام و تشکر از وقتی که گذاشتید
ولی من میخوام خودم را درگیر dataadapter و dataTable و اینها نکنم برای همین از LINQ استفاده کردم
چون اگه می خواستم از این ابزارها استفاده کنم مثل سابق از dataset استفاده می کردم و در کنارش از همین ابزارها
شما در اصل اومدین صورت مسئله را عوض کردید و به جای LINQ از dataTable استفاده کردید
مسئله اینه که وقتی bindingSource را با LINQ ارتباط می دیم فیلترش کار نمیکنه آیا امکانش هست با همین شرایط موجود فیلتر کرد ؟
باز هم تشکر

5 روش جستجو

public Form8() {

InitializeComponent();

comboBox1.DataSource = dataGridView1.DataSource = Disp("Ali"); ;
comboBox1.DisplayMember = "Name";
}

private BindingSource Disp(string name)
{//نام جدول ودیتا کلاس رو عوض کنید


//5
// روش جستجو


DataClasses1DataContext context = new DataClasses1DataContext();


var q1 = from x in context.TInfos
where x.Name .Equals(name )
select x;


var q2 = from x in context.TInfos
where x.Name.Contains( name)
select x;


var q3 = from x in context.TInfos
where x.Name.StartsWith( name)
select x;


var q4 = from x in context.TInfos
where x.Name.EndsWith( name)
select x;


var q5 = from x in context.TInfos
where x.Name==name
select x;




var bs = new BindingSource
{
DataSource = q5,
};
return bs;
}

ja_latifian
دوشنبه 08 بهمن 1397, 21:31 عصر
سلام
علت استفاده از bindingsource اینه که میخوام وقتی روی ردیفهای datagrid حرکت میکنم مقادیر سلولهای اون ردیف را در textbox های پایینش نشون بده که اینکار با databinding خیلی راحتتره در ضمن من فکر میکردم راحت مثل زمانی که dataset استفاده میکردم بوسیله databindingsource فیلتر کنم که الان متوجه شدم مثل قبل نیست

ja_latifian
دوشنبه 08 بهمن 1397, 21:38 عصر
تا اینجا درست اما یه مشکل
برنامه من طوریه که روی header هر ستون datagrid که دبل کلیک میکنه یک تکست باکس روی هدر باز میشه و جستجو انجام میشه قبلا من توی فیلتر databinding فقط اسم ستون را برابر مقدار تکست باکس قرار میدادم و فیلتر انجام میشد ولی الان که باید توی where بنویسم چطوری x.name را بنویسم در حالیکه با کلیک کردن روی هدر ، نام هدر را بصورت string دارم امیدوارم منظورم را متوجه شده باشید
باز هم ممنون و تشکر از همگی

alexmcse
سه شنبه 09 بهمن 1397, 11:48 صبح
تست کنید.....


تا اینجا درست اما یه مشکل
برنامه من طوریه که روی header هر ستون datagrid که دبل کلیک میکنه یک تکست باکس روی هدر باز میشه و جستجو انجام میشه قبلا من توی فیلتر databinding فقط اسم ستون را برابر مقدار تکست باکس قرار میدادم و فیلتر انجام میشد ولی الان که باید توی where بنویسم چطوری x.name را بنویسم در حالیکه با کلیک کردن روی هدر ، نام هدر را بصورت string دارم امیدوارم منظورم را متوجه شده باشید
باز هم ممنون و تشکر از همگی


private void LoadData() {
//رویداد لود فرم قرار دهید
textBox1.Text = "Ali";
textBox2.Text = "Name";
//ya
textBox1.Text = "Alipor";
textBox2.Text = "Family";
b = Disp(textBox1.Text, textBox2.Text);


dataGridView1.DataSource = b;


}


private BindingSource Disp(string text,string nameColumn )
{//نام جدول ودیتا کلاس رو عوض کنید


//5
// روش جستجو


DataClasses1DataContext context = new DataClasses1DataContext();


//var q1 = from x in context.TInfos
// where x.Name.Equals(name)
// select x;


//var q2 = from x in context.TInfos
// where x.Name.Contains(name)
// select x;





//var q4 = from x in context.TInfos
// where x.Name.EndsWith(name)
// select x;


//var q5 = from x in context.TInfos
// where x.Name == name
// select x;


IQueryable<TInfo> result = null;


switch (nameColumn )
{
case "Name":
{
var name = from x in context.TInfos
where x.Name == (text)
select x;
result = name;
}
break;
case "Family":
{
var fam = from f in context.TInfos
where f.Family == (text)
select f;
result = fam;
}
break;
}






var bs = new BindingSource
{
DataSource =result ,

};
return bs;
}

ja_latifian
شنبه 13 بهمن 1397, 16:59 عصر
خیلی ممنون و متشکر