PDA

View Full Version : نحوه استفاده از Asp.net Grid user control در سایر صفحات



nlufrnuri
سه شنبه 29 اردیبهشت 1394, 13:36 عصر
سلام
من برای برنامه ام ، یک user Control تعریف کردم ، که در آن یک Data Grid قراردادم و با css یک استایل خاصی بهش دادم .
خب این user Control ساخته شده ،
بعد تو صفحه اصلی که می خوام اطلاعات رو نمایش بدم این UC رو آوردم ، خب اول Registeresh کردم و بعد ازش استفاده کردم :

<%@ Register Src="~/UserControls/CustomGrid.ascx" TagPrefix="uc1" TagName="CustomGrid" %>
<uc1:CustomGrid runat="server" ID="CustomGrid" />

حالا اتفاق بد اینه که وقتی در code behind می خوام بهش دسترسی داشته باشم و بهش DataSource یدم ، آیتم DataSource نداره. و فقط DataBind و DataBinding داره .
ازش نمونه هم ساختم البته : UserControls.CustomGrid a = new UserControls.CustomGrid();
آخه مگه میشه ؟!
در حالیکه تو خود Code behined مربوط به Source Control ، DataSource هم وجود داره .

Davidd
سه شنبه 29 اردیبهشت 1394, 13:50 عصر
سلام. توی یوزر کنترل یه متد تعریف کنید که به DataSource گرید مقدار بده و در کد صفحه این متدو صدا بزنید.
من فک میکنم شما یه شی از یه یوزرکنترل میسازی UserControls.CustomGrid a = new UserControls.CustomGrid() و میخوای به DataSource یوزرکنترل مقدار بدی که طبیعیه یوزرکنترل DataSource نداره.

nlufrnuri
سه شنبه 29 اردیبهشت 1394, 14:16 عصر
سلام. توی یوزر کنترل یه متد تعریف کنید که به DataSource گرید مقدار بده و در کد صفحه این متدو صدا بزنید.
من فک میکنم شما یه شی از یه یوزرکنترل میسازی UserControls.CustomGrid a = new UserControls.CustomGrid() و میخوای به DataSource یوزرکنترل مقدار بدی که طبیعیه یوزرکنترل DataSource نداره.

ممنونم از توضیحتون ، دقیقاً مشکل من همین بود ، الان سوالم اینه که چطوری میتونم به Datasource Grid مقدار بدم ؟ منظورتون تعریف کردن Proprty هست ؟ و اینکه چطوری ؟

Davidd
سه شنبه 29 اردیبهشت 1394, 14:52 عصر
توی کد یوزرکنترل به کنترلهاش از جمله گرید دسترسی دارین. پس میتونین یه متد یا پرارتی public تعریف کنید و در صفحه ای که از یوزرکنترل استفاده میکنین، از این طریق متد یا پراپرتی تعریف شده، به DataSource گرید مقدار بدید.
کد سمت یوزرکنترل :
public void SetGridDataSource(object source){
DataGrid1.DataSource=source;
}
کد سمت صفحه :
UserControls.CustomGrid a = new UserControls.CustomGrid()
a.SetGridDataSource(yourSource);

nlufrnuri
سه شنبه 29 اردیبهشت 1394, 15:50 عصر
مشکل آخر :
وقتی کد شما رو نوشتم ، سمت یوزر کنترل وقتی می خواد اطلاعات Source رو به دیتاست بریزه DataGrid1.DataSource=source
، Object reference not set to an instance of an object میگیرم.
سمت یوزر کنترل :

public void SetGridDataSource(DataTable source) {
if (source.Rows.Count > 0 && source.Columns.Count > 0)

grdSAS.DataSource = source;
grdSAS.DataBind();


شرط if برای اینست که مطمئن شوم که Datatable اطلاعات دارد که نتیجه 3 سطر و 2 ستون است . ولی در خط بعد با خطای ذکر شده مواجه می شوم.

nlufrnuri
سه شنبه 29 اردیبهشت 1394, 15:54 عصر
سمت صفحه



CustomDictionary inParams = new CustomDictionary();
CustomDictionary outParams = new CustomDictionary();
busCompany.UserProfile_Company_Select(inParams, outParams);
DataTable dtCompany = outParams["CompanyUser"].ToDataTable();

//CustomGrid.DataSource = dtCompany;
//GridView1.DataBind();

UserControls.CustomGrid a = new UserControls.CustomGrid();

a.SetGridDataSource(dtCompany);

قسمت کامنت شده هم نشان می دهد که همین DataTable در اینجا بدون مشکل به DataGrid وصل شده و اطلاعاتش نمایش داده می شود. پس چرا در UC نمایش داده نمی شود ؟

Davidd
سه شنبه 29 اردیبهشت 1394, 16:18 عصر
برای یوزرکنترل فقط ساختن instance کافی نیست. باید از متد LoadControl استفاده بشه تا اول رندر بشه.


UserControls.CustomGrid a = new UserControls.CustomGrid();

a= LoadControl("~/UserControls/CustomGrid.ascx") as UserControls.CustomGrid;

nlufrnuri
سه شنبه 29 اردیبهشت 1394, 16:40 عصر
ولی بعید میدونم مشکل از این باشه ، چون در خود صفحه یوزر کنترل خطا دارم ، نه در صفحه اصلی که uc فراخوانی میشه .
حدس می زنم مشکل از این باشه که بجای dataset بهش dataTable پاس میدیم ؟!؟! اینم بعیده . نمی دونم

nlufrnuri
سه شنبه 29 اردیبهشت 1394, 17:13 عصر
حق با شما بود دلیل لود نشدن یوزر کنترل بود ، با کدی که بهم دادین ، مشکل برطرف شد.
و دیگه بدون خطا اجرا میشه ،
فقط مشکل خنده دار اینه که چیزی تو صفحه نشون نمی ده ، و بعد که چک کردم دیدم ، گرید ویو نهایی در UC ، بعد از Bind شدن Data شامل 18 سطر و 0 ستون هست.
000000000 ستون ؟!؟!؟!؟
یعنی سطرها رو میبینه ، ستون ها رو نمی بینه ؟
چقدر گیر و گور داره این یوزر کنترل :افسرده:

Davidd
سه شنبه 29 اردیبهشت 1394, 17:27 عصر
گیر و گور نداره اصول داره. وقتی 18 تا سطر داره و 0 ستون یعنی در گرید ستون ها تعریف نشده یا اینکه مشخص نشده هر ستون متناظر با کدام ستون در دیتاتیبله. کد قسمت دیتاگرید در یوزرکنترل بذارید.

nlufrnuri
سه شنبه 29 اردیبهشت 1394, 17:33 عصر
public void SetGridDataSource(DataSet source) {
if (source.Tables[0].Rows.Count > 0 && source.Tables[0].Columns.Count > 0)
{
grdSAS.DataSource = source;


grdSAS.DataBind();


// int ad = grdSAS.Rows.Count + grdSAS.Columns.Count;

}

}
ظاهر و باطن همینه . درسته من هیچ جا نگفتم کدوم ستون مال کدومه ، خب هیچ جا نمی گفتم . یک کلمه می گفتم Datagrid.datasource = .... تموم . خودش همه چیو می فهمید و می آورد.

Davidd
سه شنبه 29 اردیبهشت 1394, 17:59 عصر
منظورم سورس کد صفحه بود نه code behind . در مثال زیر گرید یه ستون داره که متناظر با ستون Registerdate در دیتاتیبل یا هر سورسی:
<asp:GridView ID="GridUsers" runat="server" AutoGenerateColumns="False" Width="100%" CellPadding="4" ForeColor="#333333" GridLines="None">
<AlternatingRowStyle BackColor="White" />
<Columns>

<asp:BoundField DataField="RegisterDate" HeaderStyle-HorizontalAlign="Right" HeaderText=" تاریخ عضویت">
<ControlStyle Width="200px" />
</Columns>
</asp:GridView>

nlufrnuri
چهارشنبه 30 اردیبهشت 1394, 10:09 صبح
خب مگه نباید ستون ها رو خودش تشخیص بده ، من می خوام یک یوزر کنترل کلی داشته باشم که تو صفحات مختلف ازش استفاده کنم ، یه جا دیتا دو ستون داره ، یه جا 10 تا .
اگه مجبور باشم تعداد فیلدها رو تو خود یوزر کنترل بدم که چه کاری بود یه یوزر کنترل کلی بنویسم .
هدف من استفاده داینامیک از این کنترل هست.

Davidd
چهارشنبه 30 اردیبهشت 1394, 10:14 صبح
AutoGenerateColumns را true کنید تا ستون هارو خودش بسازه

nlufrnuri
چهارشنبه 30 اردیبهشت 1394, 10:23 صبح
انجام دادم ولی باز هم columns = 0


<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CustomGrid.ascx.cs" Inherits="SAS.UserControls.CustomGrid" %><link href="../css/GridStyle1.css" rel="stylesheet" /><link href="../css/GridStyle2.css" rel="stylesheet" />

<asp:GridView ID="grdSAS" runat="server" AutoGenerateColumns="true"></asp:GridView>

nlufrnuri
چهارشنبه 30 اردیبهشت 1394, 12:02 عصر
مشکل برطرف شد . دلیل این بود که از یوزر کنترل گرید ویو ، یک اینستنس ساخته شد . اما این نمونه گرید به کانتینری از صفخه add نشده بود .
وقتی به یک پنل add اش کردم ، مشکل حل شد و نمایش داده شد.
به هر حال از کمکی که در این پروسه به من کردید ، بسیار سپاسگذارم.