PDA

View Full Version : مبتدی: نمايش اطلاعات بانك SQL‌در datagridview



shekoofeh-67
دوشنبه 12 مرداد 1394, 08:01 صبح
سلام . من يه برنامه اي براي تمرين نوشتم كه با بانك sql‌در ارتباط هست . با ديتا ريدر و به صورت كد هم نوشته شده . موقع اجرا هم داده هايي كه من وارد مي كنم ،‌وارد بانك ميشه . اما ديتاگريد ويو چيزي نمايش نميده .
چي رو جا انداختم ؟ چه كدي بايد به برنامه اضافه كنم كه ديتا گريد ديتا ها رو نمايش بده ؟
همه تنظيماتش رو هم انجام دادم ديتا گريد رو .

Mani_rf
دوشنبه 12 مرداد 1394, 08:21 صبح
سلام.
چه کدی نوشتید برای این که اطلاعات رو توی گرید نشون بدید.

shekoofeh-67
دوشنبه 12 مرداد 1394, 09:53 صبح
Sub fill()

If con.State = ConnectionState.Closed Then
con.Open()

End If
cmd.CommandText = "select * from tb_phone"
con.Close()


End Sub
بعد هم فراخواني اش كردم اينجا
Private Sub btn_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_save.Click

If jadid Or virayesh Then

If (String.IsNullOrEmpty(txt_name.Text.Trim())) Or (String.IsNullOrEmpty(txt_family.Text())) Then
MessageBox.Show("لطفا نام و نام خانوادگي را كامل كنيد . ", "هشدار")

ElseIf (String.IsNullOrEmpty(txt_mobile.Text())) Or String.IsNullOrEmpty(txt_tel.Text()) Then
MessageBox.Show("لطفا شماره موبايل و تلفن را وارد كنيد .", "هشدار")

ElseIf txt_address.Text.Contains("@") = False Then
MessageBox.Show("ايميل نامعتبر است .", "هشدار")

ElseIf jadid Then



cmd.CommandText = "insert into tb_phone(name,family,company,mobile,tel,email) values ('" + txt_name.Text + "','" + txt_family.Text + "','" + txt_company.Text + "','" + txt_mobile.Text + "','" + txt_tel.Text + "','" + txt_address.Text + "')"

If con.State = ConnectionState.Closed Then
con.Open()
End If
dr = cmd.ExecuteReader

If dr.Read Then
MessageBox.Show("اطلاعات وارد شد ", "ورود اطلاعات")
End If
dr.Close()




fill()


'cmd.ExecuteNonQuery()
con.Close()


groupBox1.Enabled = False
DataGridView1.Enabled = False
jadid = False
btn_save.Enabled = False
btn_edit.Enabled = True
btn_del.Enabled = True
btn_serch.Enabled = True
btn_save.Text = "ذخيره تغييرات "
txt_name.Clear()
txt_family.Clear()
txt_company.Clear()
txt_mobile.Clear()
txt_tel.Clear()
txt_address.Clear()

ElseIf virayesh Then

If con.State = ConnectionState.Closed Then
con.Open()
End If

cmd.CommandText = "update tb_phone set name='" + txt_name.Text + "' , family='" + txt_family.Text + "' , company='" + txt_company.Text + "', mobile='" + txt_mobile.Text + "',tel='" + txt_tel.Text + "',email='" + txt_address.Text + "' where id='" + txt_id.Text + "'"

MessageBox.Show("اطلاعات ويرايش شد .", "ويرايش")
cmd.ExecuteNonQuery()
con.Close()

fill()

virayesh = False
groupBox1.Enabled = False
DataGridView1.Enabled = False
btn_save.Enabled = False
btn_new.Enabled = True
btn_del.Enabled = True
btn_edit.Enabled = True
btn_serch.Enabled = True
btn_save.Text = "ذخيره تغييرات "
txt_name.Clear()
txt_family.Clear()
txt_company.Clear()
txt_mobile.Clear()
txt_tel.Clear()
txt_address.Clear()

End If
End If

If hazf Then
If DataGridView1.Rows.Count > 0 Then
If MessageBox.Show("آيا براي حذف مطمئن هستيد ؟", "حذف اطلاعات", MessageBoxButtons.YesNo) = DialogResult.Yes Then

If con.State = ConnectionState.Closed Then
con.Open()
End If

cmd.CommandText = "delete from tb_phone where id='" + txt_id.Text + "'"


cmd.ExecuteNonQuery()
con.Close()
fill()

btn_new.Enabled = True
btn_edit.Enabled = True
btn_save.Enabled = True
btn_serch.Enabled = True
groupBox1.Enabled = False
DataGridView1.Enabled = False
btn_save.Text = "ذخيره تغييرات "

txt_name.Clear()
txt_family.Clear()
txt_company.Clear()
txt_mobile.Clear()
txt_tel.Clear()
txt_address.Clear()
End If
End If
End If

End Sub

shekoofeh-67
دوشنبه 12 مرداد 1394, 09:58 صبح
Private jadid As Boolean = False
Private virayesh As Boolean = False
Private hazf As Boolean = False
Private englishinput As InputLanguage

Dim con As New SqlConnection
Dim s1 As String
Dim cmd As New SqlCommand(s1, con)
Dim dr As SqlDataReader

اين ها رو هم اول كلاس فرم تعريف كردم


اين هم لود فرمم :
Private Sub frm_telbook_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load



con.ConnectionString = "Data Source=ENG_WORK1;Initial Catalog=phonebook;Integrated Security=True"

fill()




End Sub

aliebrahimi1900
دوشنبه 12 مرداد 1394, 11:06 صبح
دوست عزیز Fill رو به صورت زیر بنویس


Sub fill()

If con.State = ConnectionState.Closed Then
con.Open()

End If
Dim dAd As New SqlDataAdapter("select * from tb_phone", Con)
Dim dTbl As New DataTable
dAd.Fill(dTbl)
DataGridView1.DataSource = dTbl
con.Close()


End Sub

shekoofeh-67
سه شنبه 13 مرداد 1394, 15:06 عصر
اين جواب ميده ولي من مي خوام بتونم ديتا گريد رو هدرشو فارسي كنم و پهناي هر ستونم رو هم خودم بتونم تعيين كنم . با اين روش نميشه . هدر ها رو به همون اسم انگليسي كه توي بانك دادم مشخص ميكنه.

aliebrahimi1900
چهارشنبه 14 مرداد 1394, 00:20 صبح
برای تغیر نام نمایشی راه های زیادی هستش
به نير من بهتره زمان خوندن نام هر فیلدو میخوای عوض کنی مثل این



Dim sqlString As String = "Select Name As 'نام' ,lName As 'فامیل' From tblName"
Dim com As SqlDataAdapter = New SqlDataAdapter(sqlString, Connection)
Dim dTable As New DataTable
Connection.Open()
com.Fill(dTable)
Connection.Close()






برای تغیر اندازه هم از این استفاده کن



DataGridView1.Columns("ID").Width = 50
'OR
Dim i As Integer = 2 ' شماره ایندکس فیلد

DataGridView1.Columns(i).Width = 50



اگه مشکل داشتی اسم فیلد هاتو بزار برات بنویسمش

shekoofeh-67
چهارشنبه 14 مرداد 1394, 14:35 عصر
اين كد ها رو كجا بايد بنويسم ؟ توي همون ساب fill‌ يا يه جاي ديگه ؟

aliebrahimi1900
چهارشنبه 14 مرداد 1394, 16:48 عصر
دوست خوب من :ناراحت:
اسم فیلد ها و اسمی که باید بالاشون نمایش داده بشه یعنی فارسیشونو بزار تعداد فیلد هاتم بزار
بله توی همون fill باید بنویسی

mehdi.safavie
یک شنبه 18 مرداد 1394, 08:00 صبح
درود

روی خود DataGridView کلیک کن Add Column یا Edit Column رو بزن ، از اونجا فیلد هات رو ادد کن و اسم های فارسی بزار . مقدار Width رو هم که دوستمون فرمودند رو هم همونجا تغییر بده .
برای هر ستونی که ساختی یک Peropertis داره ، فقط یادت باشه تو Data Peroperty حتما نام انگلیسی که برای فیلد تو SQL گذاشتی رو باید بزاری . مثلا اگر یه فیلد به نام Student_name داری ، تو اسمش گذاشتی 'نام دانش آموز' تو Data Peroperty اون حتما باید بزاری Student_name .
دیگه خاصیت های Visible Enable و ....... همه تو پروپرتیس هر ستون هستش .
مثلا اگه نمیخوای یه ستون تو DataGridView نمایش داده بشه Visible اون رو False کن .

shekoofeh-67
یک شنبه 18 مرداد 1394, 11:34 صبح
اين جواب ميده . ولي من ميخوام با استفاده از ديتا ريدر اطلاعات بانك رو در ديتا گريد ويو نمايش بدم . راه حلي براي اون نداريد ؟

mehdi.safavie
یک شنبه 18 مرداد 1394, 16:07 عصر
چه نیازی به دیتا ریدر دارید ؟
اگه واجبه میشه لطفا توضیح بدید ؟

در غیر این صورت :

اول یه کانکشن گرفتم .
بعد یه تابع برای اجرای دستورات ساختم به نام Mod_DatabaseTools ، که یکی از ماژول های من برای برنامه نویسی هست .




Public Connection As New SqlConnection("Data Source=.\SQLExpress;Integrated Security=True;Initial Catalog=DatabaseName")

Public Function Mod_DatabaseTools(ByVal strCommand As String, ByRef MyDataSet As DataSet, ByVal strTableName As String, Optional ByVal ShowError As Boolean = True) As Boolean
Try If Connection.State = ConnectionState.Closed Then
Connection.Open()
End If


Dim dap_tmp As New SqlDataAdapter(strCommand, Connection)
Try
MyDataSet.Tables(strTableName).Clear()
dap_tmp.Fill(MyDataSet, strTableName)
Catch ex As Exception
dap_tmp.Fill(MyDataSet, strTableName)
End Try
SelectCommand = True
Catch ex As Exception
If ShowError = True Then
MsgBox(".خطای زیر در اجرای برنامه رخ داده است" & vbCrLf & ex.Message, MsgBoxStyle.OkOnly + MsgBoxStyle.Critical, "خطا")
End If
SelectCommand = False
Finally
Try
Connection.Close()
Catch ex As Exception
' Nothing...
End Try




End Try
End Function



حالا یه روال تعریف کردم برای پرکردن اطلاعات بر روی DataGrideView
به دو صورت که یا شما همه اطلاعات رو انتخاب میکنی ، یا هر تعداد فیلدی که نیاز دارید رو انتخاب میکنید . فیلد های 1 تا 3 به عنوان مثال .


Private Sub Fill()
Dim dst As New DataSet
Dim bns As New BindingSource
'Mod_DataBaseTools.SelectCommand("select * from TableName", dst, "TableName")
Mod_DataBaseTools.SelectCommand("select [field1],[field2],[field3] from TableName", dst, "TableName")
bns.DataSource = dst
bns.DataMember = "TableName"
bns.Filter = ""
DataGrideView1.DataSource = bns
End Sub


حالا تو خود DataGrideView برید و کارهایی که بالا گفتم رو انجام بدید . فیلد ها رو اضافه کنید و DataProperty ها رو با نام فیلد ها برابر کنید و اگر نیازی به اون فیلد برای نمایش تو جدول نبود Visible رو غیر فعال کنید .

نیازی به دیتا ریدر نیست واسه این کار ها .


اگر متوجه نمیشید باز بپرسید .

shekoofeh-67
دوشنبه 19 مرداد 1394, 09:35 صبح
خيلي ممنون از جوابتون .
دليلم هم توي اولين ارسالم فكر كنم گفتم . من دارم تمرين مي كنم و مي خوام اين روش رو ياد بگيرم . ولي برام جالبه كه هيچ جا آموزش كاملي براش ارائه نشده . از هر كي هم سوال مي پرسم ،‌اوني كه مد نظر منه رو بهم نميگه.

shekoofeh-67
دوشنبه 19 مرداد 1394, 15:15 عصر
به كمك رئيس توي شركت به يه نتايجي رسيدم .
Sub fill()


If con.State = ConnectionState.Closed Then
con.Open()

End If
cmd.CommandText = "select * from tb_phone"
dr = cmd.ExecuteReader

While dr.Read

Me.DataGridView1.Item(0, 0).Value = dr.Item(0)
Me.DataGridView1.Item(1, 0).Value = dr.Item(1)
Me.DataGridView1.Item(2, 0).Value = dr.Item(2)
Me.DataGridView1.Item(3, 0).Value = dr.Item(3)
Me.DataGridView1.Item(4, 0).Value = dr.Item(4)
Me.DataGridView1.Item(5, 0).Value = dr.Item(5)
Me.DataGridView1.Item(6, 0).Value = dr.Item(6)


End While


con.Close()


End Sub

الان به من جوابي كه مي خوام رو ميده . ولي مشكلش اينه كه فقط يك سطر توي ديتا گريد نشون ميده نه همه اطلاعات رو .
اون هم آخرين اطلاعاتي هست كه وارد بانك شده .

shekoofeh-67
یک شنبه 29 شهریور 1394, 08:18 صبح
مشكل قبلي رو اينطوري حل كردم :

Sub fill()

If con.State = ConnectionState.Closed Then
con.Open()

End If
cmd.CommandText = "select * from tb_phone"
dr = cmd.ExecuteReader

While dr.Read
Dim i As Integer
i = DataGridView1.Rows.Add()
Me.DataGridView1.Item(0, i).Value = dr.Item(0)
Me.DataGridView1.Item(1, i).Value = dr.Item(1)
Me.DataGridView1.Item(2, i).Value = dr.Item(2)
Me.DataGridView1.Item(3, i).Value = dr.Item(3)
Me.DataGridView1.Item(4, i).Value = dr.Item(4)
Me.DataGridView1.Item(5, i).Value = dr.Item(5)
Me.DataGridView1.Item(6, i).Value = dr.Item(6)

End While

con.Close()

End Sub
الان مشكلم اينه كه بعد هربار تغيير ،‌ هم رديف هاي قبلي رو توي ديتا گريد نشون ميده ،‌هم رديف هاي تغيير داده شده .
راه حلي داريد؟

shekoofeh-67
سه شنبه 31 شهریور 1394, 08:16 صبح
بايد همون ابتداي sub‌قبل از كد ديگه اي اين كد رو بنويسم . اين مشكلم حل شد . برنامه ام كاملا آماده است .
Me.DataGridView1.Rows.Clear()