PDA

View Full Version : یه مشکل با DataGridView



navidal
پنج شنبه 30 آذر 1385, 07:30 صبح
سلام دوستان
من یه دیتا گرید دارم که یه سری فیلد ها رو از جدولی می خونه و نمایش میده و یه ستون از نوع button هم داره که واسه حذف رکورد بکار می ره و یه فیلد عکس هم هست که با توجه به حرکت روی سطرهای datagrid عکس درون picturebox ی نمایش داده میشه حال وقتی دکمه حذف زده میشه و می خوام عکس رو از روی هارد پاک کنم پیغام میده که عکس داره توسط یه پروسه ای استفاده میشه ! با اینکه من picturebox رو Dispose می کنم ولی بازم خطا میده اصلا picturebox هم برداشتم و یه ستون از نوع عکس تعریف کردم که تو خود datagrid عکس رو نمایش بده ولی باز هم همین خطا رو میده. یه عکس هم گذاشتم که ببینید البته حالت های مختلف رو چک کردم مثلا یه بار ستون عکس رو حذف کردم یه بار picturebox رو ، سطر datagrid رو dispose کردم موقع کلیک و حالت های بسیار دیگری ولی مشکل همچنان پابرجاست.در ضمن من برای نمایش از رویداد کلیک دیتا گرید و برای حذف از رویداد CellContentClick استفاده می کنم

اگه کسی کمک کنه واقعا ممنون میشم.

vahidiran
پنج شنبه 30 آذر 1385, 10:37 صبح
دوست عزیز من هم همین مشکل رو داشتم راه حلی نتونستم براش پیدا کنم ولی اومدم سرش کلک زدم یعنی وقتی که می خواستم برای مثال عکس رو بگذارم داخل picturebox از عکس واقعی یک کپی می گرفتم به نام مثلا temppic و temppic رو می گذاشتم تو picturebox بعدا که می خواستم عکس رو پاک کنم عکس واقعی به راحتی پاک می شد و با dispose کردن خاصیت image در picturebox عکس موقتی رو هم از روز فرم پاک می کردم

در ضمن یه اشکال دارم در DataGridView که نمی دونم رویداد های کلیدهایی که مثلا در یک ستون هستند رو پیدا کنم شما می تونید کمکم کنید

problem
پنج شنبه 30 آذر 1385, 13:57 عصر
یه عکس هم گذاشتم که ببینید

عکس که نگذاشتید. اما کد رو بگذارید، ببینم چی از دستم بر می‌آد.

navidal
جمعه 01 دی 1385, 14:40 عصر
دوست عزیز من هم همین مشکل رو داشتم راه حلی نتونستم براش پیدا کنم ولی اومدم سرش کلک زدم یعنی وقتی که می خواستم برای مثال عکس رو بگذارم داخل picturebox از عکس واقعی یک کپی می گرفتم به نام مثلا temppic و temppic رو می گذاشتم تو picturebox بعدا که می خواستم عکس رو پاک کنم عکس واقعی به راحتی پاک می شد و با dispose کردن خاصیت image در picturebox عکس موقتی رو هم از روز فرم پاک می کردم

در ضمن یه اشکال دارم در DataGridView که نمی دونم رویداد های کلیدهایی که مثلا در یک ستون هستند رو پیدا کنم شما می تونید کمکم کنید
در مورد سوالتون اگه راهشو پیدا کردم خبر می کنم.

navidal
جمعه 01 دی 1385, 14:46 عصر
عکس که نگذاشتید. اما کد رو بگذارید، ببینم چی از دستم بر می‌آد.

ببخشید اینم عکس.



من می خوام وقتی دکمه حذف زده شد فایل عکس بطور فیزیکی از روی هارد هم حذف شه ولی خطا میده می گه یه پروسه ای داره باش کار میکنه

problem
جمعه 01 دی 1385, 15:16 عصر
عکس لازم نبود! کد رو بفرستید ببینم چه می‌شه کرد.

vahidiran
جمعه 01 دی 1385, 15:25 عصر
من دنبال همین هستم یعنی می خوام رویداد های کلیدهای حذف رو پیدا کنم
راستی picture چه جوری گذاشته اید داخل DatagridView

navidal
شنبه 02 دی 1385, 09:40 صبح
عکس لازم نبود! کد رو بفرستید ببینم چه می‌شه کرد.


در این قسمت عکس ها از بانک خوانده میشن و به دیتا گرید نسبت داده میشن (سلول 6 عکس است)


Private Sub Ins_product_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim str As String
For i = 0 To Me.BindingContext(Ds2, "t").Count - 1
str = Trim(Convert.ToString(Me.BindingContext(Ds2, "t.path").Current))
If str <> "" Then
DataGridView1.Rows(i).Cells(6).Value = System.Drawing.Image.FromFile((Convert.ToString(Ap plication.StartupPath + "\image\" + Ins_Co.Label1.Text + "\" + Me.BindingContext(Ds2, "t.path").Current)))
End If
Me.BindingContext(Ds2, "t").Position += 1
Next



End Sub
PictureBox1در این قسمت اگر بر روی دکمه حذف(یعنی ستون 7) کلیک کرده باشد ابتدا عکس را از
از بین میبرد سپس از دیتا گرید و بعد از اون از روی هارد

Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

If e.ColumnIndex = 7 And e.RowIndex >= 0 Then
If Trim(DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value) <> "" Then
PictureBox1.Image = Nothing
PictureBox1.Image.Dispose()
DataGridView1.CurrentRow.Cells(6).Value = Nothing
DataGridView1.CurrentRow.Dispose()
File.Delete((Application.StartupPath + "\image\" + Ins_Co.Label1.Text + "\" + (DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value)))
DataGridView1.Rows.Remove(DataGridView1.CurrentRow )
End If
DataGridView1.Rows.Remove(DataGridView1.CurrentRow )
End If

End Sub



در این قسمت اگر بر روی سطری کلیک کرد عکس اون سطر رو در بالا نمایش میده

Private Sub DataGridView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.Click


If DataGridView1.RowCount > 0 Then

PictureBox1.Image = DataGridView1.Item(6, DataGridView1.CurrentRow.Index).Value

End If
End Sub


مشکل اینه که زمانی به دستو خذف فایل میرسه خطا میده . میگه این فایل در حال استفاده است و نمی شه اونو حذف کرد .





vahidiran فکر کنم سوالهایی که داشتی در این کد جواب داده شده.

problem
یک شنبه 03 دی 1385, 17:23 عصر
این چطوره؟



Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Dim fileName as String
If e.ColumnIndex = 7 And e.RowIndex >= 0 Then
If Trim(DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value) <> "" Then
PictureBox1.Image = Nothing
PictureBox1.Image.Dispose()
DataGridView1.CurrentRow.Cells(6).Value = Nothing
DataGridView1.CurrentRow.Dispose()
fileName = Application.StartupPath + "\image\" + Ins_Co.Label1.Text + "\" + (DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value)
DataGridView1.Rows.Remove(DataGridView1.CurrentRow )
End If
DataGridView1.Rows.Remove(DataGridView1.CurrentRow )
End If

if String.IsNullOrEmpty(fileName) = false then
GC.Collect()
GC.WaitForPendingFinalizers()
File.Delete(fileName)
end if

End Sub


این GC هم همون Garbage Collector‌ هستش ها.

vahidiran
یک شنبه 03 دی 1385, 18:36 عصر
ممنون problem
حالا اگه جای کلید ها یک checkbox باشه چه جوری باید چکش کنیم با CellContentClick هم می شه نه ؟
و در آخر هم اگه بخواهیم یک کنترل دیگه مثلا progressbar بگذاریم باید چکار کنیم

navidal
سه شنبه 05 دی 1385, 06:46 صبح
Problem جون کدی که نوشتی رو امتحان کردم بازم جواب نداد فکر کنم مشکلم از اینه که من توی رویداد click دیتا گریدم عکسها رو به Picturebox نسبت دادم و حالا نمی دونم تداخلی بین رویداد های CellContentClick و Click پیش می آید چون وقتی کدهای رویداد Click رو پاک می کنم جواب می ده . این کد قسمت click هستش :


Private Sub DataGridView1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.Click

If DataGridView1.RowCount > 0 Then
If Trim((DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value)) <> "" Then
PictureBox1.Image = System.Drawing.Image.FromFile(Application.StartupP ath + "\image\" + Ins_Co.Label1.Text + "\" + (DataGridView1.Item(8, DataGridView1.CurrentRow.Index).Value))
Else
If Not IsNothing(PictureBox1.Image) Then
PictureBox1.Image = Nothing
End If
End If
End sub

navidal
چهارشنبه 06 دی 1385, 19:25 عصر
:متفکر::ناراحت:

problem
چهارشنبه 06 دی 1385, 20:37 عصر
دارم روش کار می‌کنم. شکیبا باشید.

م_پورنگ
شنبه 09 دی 1385, 10:24 صبح
شما برای حذف عکس می تونید از این دستور استفاده کنید

My.Computer.FileSystem.DeleteFile("مسیر عکس")
دلیلشم اینه که اون عکس توسط برنامه شما در حال پروسس است و نمیتوانید مستقیما از داخل پرو‍ژه اونو حذف کنید

navidal
دوشنبه 11 دی 1385, 18:44 عصر
شما برای حذف عکس می تونید از این دستور استفاده کنید

My.Computer.FileSystem.DeleteFile("مسیر عکس")
دلیلشم اینه که اون عکس توسط برنامه شما در حال پروسس است و نمیتوانید مستقیما از داخل پرو‍ژه اونو حذف کنید

آقا این کدی که نوشتی فرقی با مال من نداره تست هم کردم جواب نداد!

problem
دوشنبه 11 دی 1385, 21:42 عصر
شما اون کدی که توش از GC استفاده شده بود رو تست کردی کار نکرد؟

navidal
جمعه 15 دی 1385, 23:45 عصر
شما اون کدی که توش از GC استفاده شده بود رو تست کردی کار نکرد؟



آره تستش کردم ولی بازم مشکل پابرجاست!
حالا من دیگه از خیرش گذشتم و بجای ستون از یه دکمه واسه حذف استفاده کردم چون دیگه واقعا کلا فه شده بودم.
اگه تونستی مشکل رو حل کنی ما رو هم بی نصیب نذار
قربان شما.
راستی میشه بگی این GC چی هست؟

problem
شنبه 16 دی 1385, 09:42 صبح
عرض شد که GC همون Garbage Collector هست، یعنی قسمتی از Net Framework. که مسئول حذف کردن متغیرها و ... یی از حافظه هست که دیگه استفاده نمی‌شن.