PDA

View Full Version : سوال: استفاده از یک LINQ چند جدوله و اتصال یک Gridview به آن به صورت داینامیک



Behrang_a
شنبه 14 اسفند 1389, 09:34 صبح
من یک Gridview دارم که بصورت داینامیک BoundField میسازم و به یک LINQ چند جدوله مرتبطش میکنم
این LINQ از دو تا جدول مرتبط تشکیل شده که یکی اسمش CertificateType هست که از طریق یک EID با جدول دیگری به اسم Equipment در ارتباط است. جدول اول ستونهای (CID,Name,EID) را دارد و جدول دوم (EID,EName)
بصورت عادی در کد نویسی میتوان به راحتی از یک شئ از جنس CertificateType از Query استخراج کنیم به راحتی به ستونهای جدول Equipment که با جدول CertificateType مرتبط هستند دسترسی داشت :

CertificateType Cert = new CertificateType();
string Name = Cert.Equipment.EName;



مشکل من در اتصال این LINQ به صورت داینامیک به Gridview هست، در حالتی که من انجام میدم اطلاعات جدول اول متصل میشود اما راهی پیدا نمیکنم که اطلاعات جدول Equipment را بازیابی کنم

IQueryable<CertificateType> CTList = CertificateTypeSearch();
GridView1.DataSource = CTList;
//Setting DataKeyNames
GridView1.DataKeyNames = new string[] { "CID", "Name"};
//Binding Data by creating BoundField
BoundField Name = new BoundField();
Name.DataField = "Name";
Name.HeaderText = "Name";

BoundField EquipmentName = new BoundField();
EquipmentName.DataField = "Equipment.EName";
EquipmentName.HeaderText = "Equipment Name";
GridView1.Columns.Add(Name);
GridView1.Columns.Add(EquipmentName);
GridView1.DataBind();




public static IQueryable<CertificateType> CertificateTypeSearch()
{
DataClassesDataContext context = new DataClassesDataContext();
var CertType = (from certificateType in context.CertificateTypes
select certificateType);
return CertType;
}


ستون Name متصل میشود اما Equipment.EName مشکل ساز است.
حالا کسی تجربه این کار رو اگه داره ممنون میشم راهنمایی کنه

Himalaya
یک شنبه 15 اسفند 1389, 00:56 صبح
مشکلتون طبیعیه. چون شما تو دیتا سورسی که به گرید دادید چیزی به عنوان Equipment.EName ندارید. پس ارور میده
اگه درست متوجه شده باشم، شما تو گرید فیلدهایی از 2 جدول رو میخواید داشته باشید که در این صورت >>>


public static object CertificateTypeSearch()
{
DataClassesDataContext context = new DataClassesDataContext();
var CertType = from certificateType in context.CertificateTypes
select new { CID = certificateType.CID, Name = certificateType.Name, EName = certificateType.Equipment.EName };
return CertType;
}

Anonymous Types


protected void Button1_Click(object sender, EventArgs e)
{
var CTList = DataClassesDataContext.CertificateTypeSearch();
GridView1.DataSource = CTList;
//Setting DataKeyNames
GridView1.DataKeyNames = new string[] { "CID", "Name" };
//Binding Data by creating BoundField
BoundField Name = new BoundField();
Name.DataField = "Name";
Name.HeaderText = "Name";

BoundField EquipmentName = new BoundField();
EquipmentName.DataField = "EName";
EquipmentName.HeaderText = "Equipment Name";
GridView1.Columns.Add(Name);
GridView1.Columns.Add(EquipmentName);
GridView1.DataBind();
}

----------------------------------------------------------------------
به خاطر Anonymous Types یا نوع های بی نام، خروجی متد CertificateTypeSearch رو object گرفتم. یا میشه مثلا یه کلاس داشته باشیم به اسم MyClass که 3 تا فیلد CID, Name , EName داشته باشه و خروجی رو به صورت


IQueryable<MyClass>

برگردونیم . اینطوری


partial class DataClassesDataContext
{
public static IQueryable<MyClass> CertificateTypeSearch()
{
DataClassesDataContext context = new DataClassesDataContext();
var CertType = from certificateType in context.CertificateTypes
select new MyClass() { CID = certificateType.CID, Name = certificateType.Name, EName = certificateType.Equipment.EName };
return CertType;
}
}

public class MyClass
{
public int CID { get; set; }
public string Name { get; set; }
public string EName { get; set; }
}

--------------------------------------------------------------------
ضمن اینکه لازم نیست ستونهاتون رو تو قسمت Code Behind تعریف کنید. (حداقل در این مورد لازم نبود) میتونید مثلا به این صورت عمل کنید


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CID,Name">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="EName" HeaderText="Equipment Name" />
</Columns>
</asp:GridView>


protected void Button1_Click(object sender, EventArgs e)
{
var CTList = DataClassesDataContext.CertificateTypeSearch();
GridView1.DataSource = CTList;
GridView1.DataBind();
}

Behrang_a
یک شنبه 15 اسفند 1389, 08:25 صبح
فکر میکنم واقعا راهی جز این نیست، مجبورم یک کلاس جدید درست کنم که این خصوصیات رو همونطور که تعریف کردی بریزم توش، اما خوب نمیتونم که Gridview رو به صورت HTML تعریف کنم چون چیزی که دارم مینویسم یک User Control هست و بر اساس چیزی که انتخاب میشه GridView رو میسازه.

حالا اگر به صورت HTML میساختم این مشکل رو نداشتم. جالبیش اینه که در حالت HTML به راحتی Equipment.EName رو تشخیص میده و بازیابی میکنه. با یه دستور ساده

<%# Eval('Equipment.EName') %>دیگه تنها راه حل کار بصورت داینامیک همین هست که تو میگی.
خیلی ممنون.