PDA

View Full Version : چگونه دکمه داینامیک به ازای نمایش رکودها درست کنیم



bitcob589
جمعه 09 اسفند 1392, 22:32 عصر
با سلام
در صفحه فرم یک گرید ویو وجود دارد که در آن اطلاعات دیتابیس نمایش داده می شود و در همان فرم یک کمبوباکس وجود دارد که تعداد رکودهای که در نظر داریم در گرید ویو نمایش داده شود انتخاب می کنیم چگونه می توان در زمانی تعداد نمایش رکود در کمبوباکس انتخاب می کنیم به ازای نمایش رکود در گریدویو به تناسب دکمه دینامیک تولید کنیم و با کلیک بر روی دکمه رکودهای که صفحه مورد نظرمان وجود دارد مشاهده کنیم مثل دکمه های خود گرید ویو اگر بر روی دکمه که ایجاد کلیک کنیم اگر page گرید ویو 10 تایی انتخاب کرده باشیم در page 4 گرید ویو رکورد 40 تا 50 در دیتابیس نشان می دهد مثل همان گرید ویو خودش به صورت دینامیک دکمه دینامیک تولید می کند می کند

کدها به صورت زیر است

public Form1() {
InitializeComponent();


db = new Database1Entities();
pageNumber = 1;
cbCountPerPage.SelectedIndex = 1; //<-- this line call cbCountPerPage_SelectedIndexChanged
}


private void btnFirstPage_Click(object sender, EventArgs e)
{
pageNumber = 1;
GetPage();
}


private void btnPreviousPage_Click(object sender, EventArgs e)
{
if (pageNumber > 1)
{
pageNumber--;
}
GetPage();
}


private void btnNextPage_Click(object sender, EventArgs e)
{
if (pageNumber < totalPageCount)
{
pageNumber++;
}
GetPage();
}


private void btnLastPage_Click(object sender, EventArgs e)
{
pageNumber = totalPageCount;
GetPage();
}


private void cbCountPerPage_SelectedIndexChanged(object sender, EventArgs e)
{
countPerPage = Convert.ToInt32(cbCountPerPage.SelectedItem);
GetPage();
}




private void GetPage()
{
totalRecordCount = db.Person.Count();
totalPageCount = (int)System.Math.Ceiling((double)totalRecordCount / countPerPage);
int previousPageNumber = pageNumber - 1;


// get page data
pageData = db
.Person
.OrderBy(rec => rec.Id)
.Skip(previousPageNumber * countPerPage)
.Take(countPerPage);


dataGridView1.DataSource = pageData;


InitializePageNavigationButtons();
}


private void InitializePageNavigationButtons()
{
if (totalRecordCount <= countPerPage)
{
panel1.Enabled = false;
}
else
{
panel1.Enabled = true;


if (pageNumber == 1)
{
btnFirstPage.Enabled = btnPreviousPage.Enabled = false;
btnNextPage.Enabled = btnLastPage.Enabled = true;
}
else if (pageNumber == totalPageCount)
{
btnLastPage.Enabled = btnNextPage.Enabled = false;
btnFirstPage.Enabled = btnPreviousPage.Enabled = true;
}
else if (pageNumber > totalPageCount)
{
pageNumber = totalPageCount;
GetPage();
}
else
{
btnLastPage.Enabled = btnNextPage.Enabled = btnFirstPage.Enabled = btnPreviousPage.Enabled = true;
}
}
}

سمپل کد (http://barnamenevis.org/showthread.php?64210-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%A9%D9%88%DA%86%DA%A9-%D9%88-%D9%85%D9%81%D9%8A%D8%AF-%D8%AF%D8%B1-%D8%B3%D9%8A-%D8%B4%D8%A7%D8%B1%D9%BE&p=1721966&viewfull=1#post1721966) پست 896

Mahmoud.Afrad
جمعه 09 اسفند 1392, 22:52 عصر
تا حالا متوجه شدی که واقعا بد توضیح میدی؟
به جای این همه توضیح که هیچی نمیشه ازش فهمید توی یک خط بگو چی میخوای.

bitcob589
جمعه 09 اسفند 1392, 23:22 عصر
بگذارید واضح تر توضیح دهم
در لینکی که در انتهای پست 1 گذاشته ام آدرس یک سمپل کد است که مر بوط صفحه بندی در گرید ویو است که در آن فرم یک کمبوباکس وجودد دارد که در آن تعداد رکودهای در نظر داریم در هر صفحه گرید ویو نمایش دهیم انتخاب می کنیم.

اگر کاربر در درون کمبوباکس انتخاب کرد که در هر صفحه گریدویو 10 رکود نمایش داده شود اگر 100 رکود بخواهیم در گریدویو نمایش دهیم با توجه به اینکه در کمبوباکس 10 رکود جهت نمایش در هر صفحه گرید ویو انتخاب کرده ایم 10 دکمه به صورت دینامیک تولید شود و با کلیک بر روی هر دکمه رکودهای خاصی نمایش دهید مثلا اگر دکمه 6 کلیک شد رکودهای 60 تا 70 نمایش دهد

اگر کاربر در درون کمبوباکس انتخاب کرد که در هر صفحه گریدویو 20 رکود نمایش داده شود اگر 100 رکود بخواهیم در گریدویو نمایش دهیم با توجه به اینکه در کمبوباکس 20 رکود جهت نمایش در هر صفحه گرید ویو انتخاب کرده ایم 5دکمه به صورت دینامیک تولید شود و با کلیک بر روی هر دکمه رکودهای خاصی نمایش دهید مثلا اگر دکمه 4 کلیک شد رکودهای 60 تا 80 نمایش دهد

Mahmoud.Afrad
جمعه 09 اسفند 1392, 23:43 عصر
کد اون پست رو بنده نوشتم و میدونم چیه.

آیا منظورت اینه؟ :
"به ازای هر صفحه یک دکمه ایجاد بشه و با کلیک روی اون اطلاعات اون صفحه به نمایش در بیاد"

دیدی توی یک خط هم میشه منظور رو رسوند.

bitcob589
جمعه 09 اسفند 1392, 23:58 عصر
کد اون پست رو بنده نوشتم و میدونم چیه.

آیا منظورت اینه؟ :
"به ازای هر صفحه یک دکمه ایجاد بشه و با کلیک روی اون اطلاعات اون صفحه به نمایش در بیاد"

دیدی توی یک خط هم میشه منظور رو رسوند.

بله منظورم همین توضیحاتی که شما فرمودید است

Mahmoud.Afrad
شنبه 10 اسفند 1392, 00:28 صبح
یک flowLayoutPanel به فرم اضافه کنید و کدها رو بصورت زیر تغییر بدید:

private void cbCountPerPage_SelectedIndexChanged(object sender, EventArgs e)
{
countPerPage = Convert.ToInt32(cbCountPerPage.SelectedItem);
GetPage();

flowLayoutPanel1.Controls.Clear();

for (int i = 1; i <= totalPageCount; i++)
{
Button btn = new Button();
btn.AutoSize = true;
btn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
btn.Text = i.ToString();
btn.Click += new EventHandler(btn_Click);
flowLayoutPanel1.Controls.Add(btn);
}
}

void btn_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
pageNumber = Convert.ToInt32(btn.Text);
GetPage();
}


private void GetPage()
{
totalRecordCount = db.Person.Count();
totalPageCount = (int)System.Math.Ceiling((double)totalRecordCount / countPerPage);

if (pageNumber > totalPageCount)
{
pageNumber = totalPageCount;
}

int previousPageNumber = pageNumber - 1;

// get page data
pageData = db
.Person
.OrderBy(rec => rec.Id)
.Skip(previousPageNumber * countPerPage)
.Take(countPerPage);

dataGridView1.DataSource = pageData;

InitializePageNavigationButtons();
}

bitcob589
پنج شنبه 15 اسفند 1392, 13:16 عصر
اگر تعداد دکمه های تولید شده تعداد زیادی داشته باشند موجب می شوند تا ظاهر فرم زشت شود آیا امکان وجود دارد در صورتی که تعداد دکمه ها از تعداد مشخصی بیشتر شد فقط تعداد محدودی از دکمه ها نمایش داده شود

در نظر بگیرید اگر 100 دکمه دینامیک تولید شده بود فقط 10 تا از دکمه ها نمایش داده شود

Mahmoud.Afrad
پنج شنبه 15 اسفند 1392, 14:49 عصر
این چیزا ساده تر اینه که سوال و جواب بخواد. چک کن اگر تعداد صفحات بیشتر از اون مقدار بود فقط 10 تا دکمه ایجاد کن.
میتونی flowLayoutPanel رو بصورتی تنظیم کنی تا scroll بخوره.

plus
پنج شنبه 15 اسفند 1392, 15:10 عصر
گذاشتن یک دکمه به ازای هر صفحه کار منطقی ای نیست.شما میتونی یک TextBox بگذاری تا کاربر صفحه مورد نظرش رو وارد کنه.

bitcob589
یک شنبه 03 فروردین 1393, 10:14 صبح
اگر تعداد دکمه های تولید شده تعداد زیادی داشته باشند موجب می شوند تا ظاهر فرم زشت شود آیا امکان وجود دارد در صورتی که تعداد دکمه ها از تعداد مشخصی بیشتر شد فقط تعداد محدودی از دکمه ها نمایش داده شود

در نظر بگیرید اگر 100 دکمه دینامیک تولید شده بود فقط 10 تا از دکمه ها نمایش داده شود

منظورم شبیه عکس زیر است
117224

Mahmoud.Afrad
یک شنبه 03 فروردین 1393, 10:25 صبح
روال کار رو بلد نیستی؟ کد نوشتی؟ تا چه حد پیش رفتی؟

bitcob589
یک شنبه 03 فروردین 1393, 11:09 صبح
روال کار رو بلد نیستی؟ کد نوشتی؟ تا چه حد پیش رفتی؟
فقط توانستم
تعداد صفحات بیشتر از 10صفحه بود فقط 10 تا دکمه ایجاد کنم



for (int i = 1; i <= totalPageCount&& i<=10; i++) {

Button btn = new Button();
btn.AutoSize = true;
btn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
btn.Text = i.ToString();
btn.Click += new EventHandler(btn_Click);
flowLayoutPanel1.Controls.Add(btn);


}

Mahmoud.Afrad
یک شنبه 03 فروردین 1393, 11:24 صبح
خوب با داشتن شماره صفحه فعلی(pageNumber) میتونی باتن ها رو شماره گذاری کنی.

bitcob589
یک شنبه 03 فروردین 1393, 11:35 صبح
منظورتان به صورت زیر است

private void cbCountPerPage_SelectedIndexChanged(object sender, EventArgs e) {
countPerPage = Convert.ToInt32(cbCountPerPage.SelectedItem);
GetPage();
flowLayoutPanel1.Controls.Clear();


for (int i = 1; i <= totalPageCount&& i<=10; i++)
{

Button btn = new Button();
btn.AutoSize = true;
btn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
btn.Text = i.ToString();
btn.Click += new EventHandler(btn_Click);
flowLayoutPanel1.Controls.Add(btn);

}
}


void btn_Click(object sender, EventArgs e)
{

Button btn = sender as Button;
pageNumber = Convert.ToInt32(btn.Text);
GetPage();

}
اما در نظر دارم شبیه عکسی که در پست 10 است دکمه ها را پیاده سازی کنم همان طور در عکس مشاهده می کنید دکمه 1-2-3 است اگر بر روی دکمه 3 کلیک شد چند دکمه بعدی یعنی 4-5-6-7 نمایش داده شود

Mahmoud.Afrad
یک شنبه 03 فروردین 1393, 11:54 صبح
باید یه مقداری جمع و تفریق کنی تا بازه رو بدست بیاری.

متد InitializePageButtons جدیده و در GetPage فراخوانی شده.

Database1Entities db;
IEnumerable<Person> pageData;
int countPerPage;
int pageNumber;
int totalRecordCount;
int totalPageCount;

public Form1()
{
InitializeComponent();

db = new Database1Entities();
pageNumber = 1;
cbCountPerPage.SelectedIndex = 1; //<-- this line call cbCountPerPage_SelectedIndexChanged
}

private void btnFirstPage_Click(object sender, EventArgs e)
{
pageNumber = 1;
GetPage();
}

private void btnPreviousPage_Click(object sender, EventArgs e)
{
if (pageNumber > 1)
{
pageNumber--;
}
GetPage();
}

private void btnNextPage_Click(object sender, EventArgs e)
{
if (pageNumber < totalPageCount)
{
pageNumber++;
}
GetPage();
}

private void btnLastPage_Click(object sender, EventArgs e)
{
pageNumber = totalPageCount;
GetPage();
}

private void cbCountPerPage_SelectedIndexChanged(object sender, EventArgs e)
{
countPerPage = Convert.ToInt32(cbCountPerPage.SelectedItem);
GetPage();
}


void btn_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
pageNumber = Convert.ToInt32(btn.Text);
GetPage();
}

private void GetPage()
{
totalRecordCount = db.Person.Count();
totalPageCount = (int)System.Math.Ceiling((double)totalRecordCount / countPerPage);

if (pageNumber > totalPageCount)
{
pageNumber = totalPageCount;
}

int previousPageNumber = pageNumber - 1;

// get page data
pageData = db
.Person
.OrderBy(rec => rec.Id)
.Skip(previousPageNumber * countPerPage)
.Take(countPerPage);

dataGridView1.DataSource = pageData;

InitializePageNavigationButtons();
InitializePageButtons();
}

private void InitializePageNavigationButtons()
{
if (totalRecordCount <= countPerPage)
{
panel1.Enabled = false;
}
else
{
panel1.Enabled = true;

if (pageNumber == 1)
{
btnFirstPage.Enabled = btnPreviousPage.Enabled = false;
btnNextPage.Enabled = btnLastPage.Enabled = true;
}
else if (pageNumber == totalPageCount)
{
btnLastPage.Enabled = btnNextPage.Enabled = false;
btnFirstPage.Enabled = btnPreviousPage.Enabled = true;
}
else if (pageNumber > totalPageCount)
{
pageNumber = totalPageCount;
GetPage();
}
else
{
btnLastPage.Enabled = btnNextPage.Enabled = btnFirstPage.Enabled = btnPreviousPage.Enabled = true;
}
}
}

private void InitializePageButtons()
{
flowLayoutPanel1.Controls.Clear();
int btnCount, firstBtnNumber, lastBtnNumber;
if (totalPageCount <= 10)
{
btnCount = totalPageCount;
firstBtnNumber = 1;
lastBtnNumber = totalPageCount;
}
else
{
btnCount = 11;
firstBtnNumber = pageNumber - 5;
lastBtnNumber = pageNumber + 5;
if (firstBtnNumber < 1)
{
lastBtnNumber = lastBtnNumber + (-firstBtnNumber);
firstBtnNumber = 1;
}

if (lastBtnNumber > totalPageCount)
{
firstBtnNumber = firstBtnNumber - (totalPageCount - lastBtnNumber);
lastBtnNumber = totalPageCount;
}
}

for (int i = firstBtnNumber; i <= lastBtnNumber; i++)
{
Button btn = new Button();
btn.AutoSize = true;
btn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
btn.Text = i.ToString();
if (i == pageNumber)
{
btn.Font = new Font(btn.Font.FontFamily, btn.Font.Size + 1, FontStyle.Bold);
}
btn.Click += new EventHandler(btn_Click);
flowLayoutPanel1.Controls.Add(btn);
}

}

}

Mahmoud.Afrad
یک شنبه 03 فروردین 1393, 12:03 عصر
باید یه مقداری جمع و تفریق کنی تا بازه رو بدست بیاری.

متد InitializePageButtons جدیده و در GetPage فراخوانی شده.

Database1Entities db;
IEnumerable<Person> pageData;
int countPerPage;
int pageNumber;
int totalRecordCount;
int totalPageCount;

public Form1()
{
InitializeComponent();

db = new Database1Entities();
pageNumber = 1;
cbCountPerPage.SelectedIndex = 1; //<-- this line call cbCountPerPage_SelectedIndexChanged
}

private void btnFirstPage_Click(object sender, EventArgs e)
{
pageNumber = 1;
GetPage();
}

private void btnPreviousPage_Click(object sender, EventArgs e)
{
if (pageNumber > 1)
{
pageNumber--;
}
GetPage();
}

private void btnNextPage_Click(object sender, EventArgs e)
{
if (pageNumber < totalPageCount)
{
pageNumber++;
}
GetPage();
}

private void btnLastPage_Click(object sender, EventArgs e)
{
pageNumber = totalPageCount;
GetPage();
}

private void cbCountPerPage_SelectedIndexChanged(object sender, EventArgs e)
{
countPerPage = Convert.ToInt32(cbCountPerPage.SelectedItem);
GetPage();
}

private void GetPage()
{
totalRecordCount = db.Person.Count();
totalPageCount = (int)System.Math.Ceiling((double)totalRecordCount / countPerPage);

if (pageNumber > totalPageCount)
{
pageNumber = totalPageCount;
}

int previousPageNumber = pageNumber - 1;

// get page data
pageData = db
.Person
.OrderBy(rec => rec.Id)
.Skip(previousPageNumber * countPerPage)
.Take(countPerPage);

dataGridView1.DataSource = pageData;

InitializePageNavigationButtons();
InitializePageButtons();
}

private void InitializePageNavigationButtons()
{
if (totalRecordCount <= countPerPage)
{
panel1.Enabled = false;
}
else
{
panel1.Enabled = true;

if (pageNumber == 1)
{
btnFirstPage.Enabled = btnPreviousPage.Enabled = false;
btnNextPage.Enabled = btnLastPage.Enabled = true;
}
else if (pageNumber == totalPageCount)
{
btnLastPage.Enabled = btnNextPage.Enabled = false;
btnFirstPage.Enabled = btnPreviousPage.Enabled = true;
}
else if (pageNumber > totalPageCount)
{
pageNumber = totalPageCount;
GetPage();
}
else
{
btnLastPage.Enabled = btnNextPage.Enabled = btnFirstPage.Enabled = btnPreviousPage.Enabled = true;
}
}
}

private void InitializePageButtons()
{
flowLayoutPanel1.Controls.Clear();
int btnCount, firstBtnNumber, lastBtnNumber;
if (totalPageCount <= 10)
{
btnCount = totalPageCount;
firstBtnNumber = 1;
lastBtnNumber = totalPageCount;
}
else
{
btnCount = 11;
firstBtnNumber = pageNumber - 5;
lastBtnNumber = pageNumber + 5;
if (firstBtnNumber < 1)
{
int temp = System.Math.Abs(firstBtnNumber);
lastBtnNumber = lastBtnNumber + temp;
firstBtnNumber = 1;
}

if (lastBtnNumber > totalPageCount)
{
int temp = System.Math.Abs(totalPageCount - lastBtnNumber);
firstBtnNumber = firstBtnNumber - temp;
lastBtnNumber = totalPageCount;
}
}

for (int i = firstBtnNumber; i <= lastBtnNumber; i++)
{
Button btn = new Button();
btn.AutoSize = true;
btn.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
btn.Text = i.ToString();
if (i == pageNumber)
{
btn.Font = new Font(btn.Font.FontFamily, btn.Font.Size + 1, FontStyle.Bold);
}
btn.Click += new EventHandler(btn_Click);
flowLayoutPanel1.Controls.Add(btn);
}

}

void btn_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
pageNumber = Convert.ToInt32(btn.Text);
GetPage();
}