PDA

View Full Version : سورت دیتاگرید



shakiba_12
سه شنبه 20 اردیبهشت 1384, 21:31 عصر
من می خوام مثلا دو تا از ستون ها ی دیتاگرید را
طوری طراحی کنم که اولا با کلیک اول بر روی آن ستون نام ستون رو بگیره
و صعودی سورت کنه و وقتی دوباره کلیک کرد نزولی
:گیج:

Behrouz_Rad
سه شنبه 20 اردیبهشت 1384, 23:46 عصر
دیتاگرید امکان مرتب سازی داده ها را به آسانی برای شما فراهم کرده است.
یک دیتا گرید ایجاد کنید. خاصیت AllowSorting را برابر با True قرار دهید.
روال OnSortCommand دیتاگرید، روال اصلی کار است.
از آنجایی که ممکن است دیتاگرید دارای خاصیت Paging باشد، وضعیت مرتب سازی باید به نحوی ذخیره شود.
بهترین راه، استفاده از Label و مخفی کردن آن بر روی فرم است.
از ViewState نیز می توانید استفاده کنید.
یک متغیر سراسری از نوع رشته ای تعریف کنید و دستور SQL ای که منبع داده به وسیله آن اقدام به پر کردن دیتاگرید می کند را در آن قرار دهید.


Protected mySelect As String = "SELECT myField1, myField2, myField3 FROM myTable"

در روال Page_Load:


If Not Page.IsPostBack Then
myLabel1.Text = mySelect
myLabel2.Text="ASC"
BindData()
End If

روال BindData:


Sub BindData()
Dim myDataSet As New DataSet
DimConStringAsString="server=localhost;database=myDB;uid=sa;pwd=;"
Dim myDataAdapter As New SqlDataAdapter(myLabel1.Text, ConString)
myDataAdapter.Fill(myDataSet, "myTable")
myDataGrid.DataSource = myDataSet.Tables("myTable")
myDataGrid.DataBind()
End Sub

روال OnPageIndexChanged دیتاگرید (خاصیت AllowPaging باید True باشد):


myDataGrid.CurrentPageIndex = E.NewPageIndex
BindData()

مهمترین روال، روال OnSortCommand دیتاگرید است که مشخص کننده ی نام ستون کلیک شده است.
در این روال، متن اولین Label را برابر با متغیر سراسری تعریف شده + دستور ORDER BY (برای مرتب سازی) + E.SortExpression + مقدار دومین Label که تعیین کننده وضعیت صعودی یا نزولی رکوردهاست قرار می دهیم.


myLabel1.Text = mySelect & " ORDER BY " & E.SortExpression & " " & myLabel2.Text
If myLabel2.Text = "DESC" Then
myLabel2.Text = "ASC"
Else
myLabel2.Text = "DESC"
End If
BindData()


موفق باشید.

shakiba_12
چهارشنبه 21 اردیبهشت 1384, 00:51 صبح
دستتون درد نکنه
بالاخره درست شد :wink:

astro2005
یک شنبه 10 آذر 1387, 15:24 عصر
اگر کوئری ما داخل StoredProcedure باشد برای پاس دادن نام فیلد (فیلدی که می خواهیم بر اساس آن سورت شود) به کوئری چه باید کرد چون نمی توان گفت order by parameter name !?

sara_B
دوشنبه 11 آذر 1387, 17:15 عصر
من می خوام مثلا دو تا از ستون ها ی دیتاگرید را
طوری طراحی کنم که اولا با کلیک اول بر روی آن ستون نام ستون رو بگیره
و صعودی سورت کنه و وقتی دوباره کلیک کرد نزولی
:گیج:



سلام ، با تشکر واجازه از مدیریت محترم، راه حل من :
یک گرید ویو روی فرم قرار دهید.
فرض کنید جدولی به نام MyTable داریم که دارای دو فیلد به نام های ID و name است و نام گرید ویو را GridView1 گذاشته ایم.همچنین نام Connection String را Conn گذاشته ایم.
به بخش Edit Columns… مربوط به گرید ویو بروید و خصوصیت " Sort Expression" ِ مربوط به Bound Filed ِ ستون مورد نظرتان را نام همان فیلد در جدول قرار دهید :


مثال :
SortExpression=ID
و برای فیلد name نیز به همین ترتیب :
SortExpression=name
خاصیت AllowSorting مبوط به گرید ویو را برابر با True قرار دهید.
اکنون در رویداد Sorting ِ گرید ویو کد زیر را وارد نمایید:






protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{

string fname = e.SortExpression + "sort";
string sortDir = "Asc";
if (ViewState[fname] == null)
{
ViewState[fname] = true;
}
else
{
if ((bool)ViewState[fname])
{
ViewState[fname] = false;
sortDir = "Desc ";
}
else
ViewState[fname] = true;
}
e.SortDirection = SortDirection.Descending;
SqlCommand cmd = new SqlCommand(
string.Format("SELECT * FROM MyTable ORDER BY {0} {1}", e.SortExpression, sortDir),
new SqlConnection(ConfigurationManager.ConnectionStrin gs["conn"].ConnectionString));
cmd.Connection.Open();
GridView1.DataSource = cmd.ExecuteReader();
GridView1.DataBind();
cmd.Connection.Close();

}

alishirazi
دوشنبه 11 آذر 1387, 22:09 عصر
حالا راه حل من : که یه خط هم کد نمی خواد:لبخند:
اولش باید بپرسم که برای bind کردن gridview از چی استفاده کردی؟ یا بهتره بگم چه کار کردید؟
اینو بهم بگی می تونم یه راه خوب پیشنهاد کنم.

sara_B
دوشنبه 11 آذر 1387, 22:37 عصر
با سلام و احترام:لبخندساده:

حالا پاسخ من :
یه تابع واسه رفرش گرید ویو می نویسم،مثل زیر :


void refresh_grd()
{
SqlCommand cmd = newSqlCommand("select * from MyTable ", newSqlConnection(WebSettings.connstrg));
cmd.Connection.Open();
GridView1.DataSource = cmd.ExecuteReader();
GridView1.DataBind();
cmd.Connection.Close();
}


بعد اونو توی Page Load صدا می زنم :



if (!Page.IsPostBack)
{
refresh_grd();
}


حالا نوبت جواب شماست