PDA

View Full Version : سوال: مشکل با RowPrePaint در DataGridView



c-sharp_South
شنبه 25 خرداد 1392, 09:35 صبح
سلام دوستان.
من توی برنامه ام برای شمارش خودکار ردیف اول از RowPrePaint استفاده کردم.



private void dg_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
dg.Rows[e.RowIndex].Cells[0].Value = e.RowIndex + 1;
}


ولی برنامه حالت هنگ کردن به خودش دست میده :اشتباه:
مثلا اگه یک textbox رو select کنم اصلا معلوم نیست که select شده.
datagridview هم مدام انگار تند تند داره چشمک میزنه. :متعجب:
اگه روی یک Button کلیک کنم کار نمیکنه .یعنی اصلا کلیک نمیشه.
مشکل کجاست؟؟؟؟ :متفکر:

Mahmoud.Afrad
شنبه 25 خرداد 1392, 09:44 صبح
از رویداد RowPostPaint استفاده کنید.

alexmcse
شنبه 25 خرداد 1392, 09:45 صبح
رویداد dg_RowPrePaint
من تا آنجایی که میدانم برای ترسیم ردیف هاست که بعضی از کاره نمیشود روی آنها انجام داد
از تایمر استفاده کن برای شمارش یا هایلایت کردن ردیف ها

mohsen22
یک شنبه 26 خرداد 1392, 05:58 صبح
نمونه مثال کوچولو دوستان در دسترس ندارند ؟مرسی

ashkan1234
یک شنبه 26 خرداد 1392, 09:33 صبح
این شماره ردیف عملا کاری انجام میده؟!!جز اینکه توی رکوردهای بالا برنامه دیگه ممکنه بالا نیاد!
بهتر نیست بجای استفاده از شماره ردیف یه شمارنده بذاریم تا تعداد رکوردها رو نمایش بده؟!
این برام سوال شده،این شماره ردیف به چه کاری میاد؟!

c-sharp_South
یک شنبه 26 خرداد 1392, 11:45 صبح
مشکل رو با این روش حل کردم که دو کار جالب و بدون مشکل انجام میده:
1- شماره هر ردیف رو نمایش میده در Columns0.
2- تعداد کل ردیف ها رو نشون میده



private void UpdateNumber()
{
int count = dg.Rows.Count;
for (int i = 0; i < count; i++)
{
dg.Rows[i].Cells[0].Value = (i + 1).ToString();
}

if (dg != null)
{
for (int countt = 0; (countt <= (dg.Rows.Count - 2)); countt++)
{
dg.Rows[0].HeaderCell.Value = string.Format((count + 1).ToString(), "0");
}
}
}


رویداد

UpdateNumber();
را در Form load قرار بدید.

mohsen22
یک شنبه 26 خرداد 1392, 21:27 عصر
خدا خیرت بده یه مدتیه هم در فروم وی بی هم در سی شارپ هر چی میگفتم چی میخوام کسی منظورمو متوجه نمیشد - مرسی
اما یه سوال کوچولو من اندیس صفرم قبلا توسط کد نویسی اشغال شده (تداخل داره با ستون شماره ردیف) - شما چه پیشنهادی دارید ؟
میتونم کار کنم اینجا (روی این برآمدگی) نشون بده؟

mohsen22
چهارشنبه 29 خرداد 1392, 20:03 عصر
کسی نظری نداره؟

khokhan
چهارشنبه 29 خرداد 1392, 20:47 عصر
کسی نظری نداره؟
مثل این نمونه

mohsen22
چهارشنبه 29 خرداد 1392, 23:43 عصر
مرسی- گیج شدم داخل کد ها!:لبخند::چشمک: میشه یه کم ساده ترش کنین برام !؟

khokhan
پنج شنبه 30 خرداد 1392, 08:08 صبح
مرسی- گیج شدم داخل کد ها!:لبخند::چشمک: میشه یه کم ساده ترش کنین برام !؟
ساده ترین روش اینه ... اما یه ایراد بزگ که داره اینه که هنگام راست به چپ کردن گرید شماره ها در سمت چپ باقی می مونه :ناراحت::گریه:


private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
var grid = sender as DataGridView;
var rowIdx = (e.RowIndex + 1).ToString();

var centerFormat = new StringFormat()
{

Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};

var headerBounds = new Rectangle(e.RowBounds.Left, e.RowBounds.Top, grid.RowHeadersWidth, e.RowBounds.Height);
e.Graphics.DrawString(rowIdx, this.Font, SystemBrushes.ControlText, headerBounds, centerFormat);
}

khokhan
پنج شنبه 30 خرداد 1392, 08:16 صبح
البته به شیوه کلک مرغابی می شه قضیه راست به چپ رو هم حل کرد :لبخند:

یه متد بنویس به این شکل :


private void FillRecordNo()
{
for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
{
this.dataGridView1.Rows[i].HeaderCell.Value = (i + 1).ToString();
}
}

بعد متد مذکور رو در رویداد DataBindingComplete دیتا گرید فراخوانی کن :

اینطوری
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
this.FillRecordNo();
}

شاد باشین :لبخند::لبخند::لبخند:

mohsen22
پنج شنبه 30 خرداد 1392, 11:51 صبح
هورااااا ... مرسی درست شد . نگفتم کارت درسته ؟! فقط مونده وسط چین بشه ؟

khokhan
پنج شنبه 30 خرداد 1392, 22:12 عصر
فقط مونده وسط چین بشه ؟

کد رویداد DataBindingComplete در پست 12 را به این صورت بنویس :


private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
FillRecordNo();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
this.dataGridView1.RowHeadersDefaultCellStyle.Alig nment = DataGridViewContentAlignment.MiddleCenter;
this.dataGridView1.RowHeadersWidth = 50;

}
}

البته هر کاری کردم بین کلمه Alignment در سطر سوم کد بالایی یه دونه فاصله می افته خودتون درستش کنین

mohsen22
جمعه 31 خرداد 1392, 00:00 صبح
مرسی اما نشد !؟ (نتیجه همون کاری هستش که کد کوتاه قبلی انجام می داد و راست چین نشد )

khokhan
جمعه 31 خرداد 1392, 00:21 صبح
مرسی اما نشد !؟ (نتیجه همون کاری هستش که کد کوتاه قبلی انجام می داد و راست چین نشد )

this.dataGridView1.RowHeadersDefaultCellStyle.Alig nment = DataGridViewContentAlignment.MiddleCenter;

خوب عزیز شما بایستی آخرین قسمت این خط رو بر مبنای چیزی که می خواهید مقدار دهی کنید

منAlignment رو بر اساس وسط چین تعین کردم یعنی MiddleCenter
حالا اگه شما می خواهید راست چین شود مقدارش رو بایستی بگذارین روی Middlergiht