2010-05-29 3 views
1

DataGrid에서 행을 업데이트하려고하지만 셀 값을 변경할 수 없다는 문제가 있습니다. 내가 참으로 내 데이터 그리드 AllowUpdate 속성을 설정했지만, 난 여전히 셀 값을 변경할 수 없습니다 :vb6의 DataGrid에서 셀을 업데이트 할 수 없습니다.

Option Explicit 
Dim conn As New ADODB.Connection 
Dim cmd As New ADODB.Command 
Dim recordset As New ADODB.recordset 
Public Action As String 
Public Person_Id As Integer 
Public Selected_Person_Id As Integer 
Public Phone_Type As String 

Public Sub InitializeConnection() 
Dim str As String 

str = _ 
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=" + App.Path + "\phonebook.mdb;" & _ 
    "Persist Security Info=False" 

    conn.CursorLocation = adUseClient 

    If conn.state = 0 Then 
    conn.ConnectionString = str 



    conn.Open (conn.ConnectionString) 
    End If 

End Sub 
Public Sub AbandonConnection() 
    If conn.state <> 0 Then 
     conn.Close 
    End If 
End Sub 
Public Sub Persons_Read() 

    Dim qry_all As String 

    ' qry_all = "select * from person,web,phone Where web.personid = person.id And phone.personid = person.id" 
    qry_all = "SELECT * FROM person order by id" 

    Call InitializeConnection 

    cmd.CommandText = qry_all 
    cmd.CommandType = adCmdText 

    Set cmd.ActiveConnection = conn 


    If conn.state = 1 Then 

     Set recordset = cmd.Execute() 

    End If 

     BindDatagrid 


End Sub 

Private Function Person_Delete(id As Integer) 
    Dim qry_all As String 
    qry_all = "Delete * from person where person.id= " & id & " " 

    Call InitializeConnection 

    cmd.CommandText = qry_all 
    cmd.CommandType = adCmdText 

    Set cmd.ActiveConnection = conn 


    If conn.state = 1 Then 

     Set recordset = cmd.Execute() 

    End If 

     dg_Persons.Refresh 



End Function 
Private Function Person_Update() 

End Function 
Public Sub BindDatagrid() 



    Set Me.dg_Persons.DataSource = recordset 


    Me.dg_Persons.Refresh 
    dg_Persons.Columns(0).Visible = False 
    dg_Persons.Columns(4).Visible = False 

    dg_Persons.Columns(1).Caption = "Name" 


    dg_Persons.Columns(2).Caption = "Family" 
    dg_Persons.Columns(3).Caption = "Nickname" 
    dg_Persons.Columns(5).Caption = "Title" 
    dg_Persons.Columns(6).Caption = "Job" 

End Sub 
Public Function DatagridReferesh() 

    Call Me.Persons_Read 

End Function 

Private Sub cmd_Add_Click() 
    frm_Person_Add.Caption = "Add a new person" 
    frm_Person_Add.Show 



End Sub 

Private Sub cmd_Business_Click() 


    ' frm_Phone.Caption = "Business Phones" 
    frm_Phone.Phone_Type = "Business" 
    frm_Phone.Person_Id = Selected_Person_Id 

    frm_Phone.Tag = Selected_Person_Id 

    frm_Phone.Show 

End Sub 

Private Sub cmd_Delete_Click() 
    Dim msg_input As Integer 

    msg_input = MsgBox("Are you sure you want to delete this person ?", vbYesNo) 

    If msg_input = vbYes Then 
     Person_Delete Selected_Person_Id 
     MsgBox ("The person is deleted") 
     frm_Phone.DatagridReferesh 

    End If 

End Sub 

Private Sub cmd_Home_Click() 

    'frm_Phone.Caption = "Home Phones" 
    frm_Phone.Phone_Type = "Home" 
    frm_Phone.Person_Id = Selected_Person_Id 
    frm_Phone.Tag = Selected_Person_Id 

    frm_Phone.Show 

End Sub 

Private Sub cmd_Update_Click() 
    If Not Selected_Person_Id = 0 Then 
    frm_Person_Edit.Person_Id = Selected_Person_Id 
    frm_Person_Edit.Show 
    Else 
    MsgBox "No person is selected" 

    End If 


End Sub 


Public Function AddParam(name As String, param As Variant, paramType As DataTypeEnum) As ADODB.Parameter 
    If param = "" Or param = Null Then 
     param = " " 
    End If 
    Dim objParam As New ADODB.Parameter 
    Set objParam = cmd.CreateParameter(name, paramType, adParamInput, Len(param), param) 
    objParam.Value = Trim(param) 
    Set AddParam = objParam 

End Function 


Private Sub Command1_Click() 
    DatagridReferesh 
End Sub 

Private Sub Command2_Click() 
    frm_Internet.Person_Id = Selected_Person_Id 
    frm_Internet.Show 

End Sub 

Private Sub dg_Persons_BeforeColEdit(ByVal ColIndex As Integer, ByVal KeyAscii As Integer, Cancel As Integer) 


    ' MsgBox ColIndex 

' dg_Persons.Columns(ColIndex).Text = "S" 
' dg_Persons.Columns(ColIndex).Locked = False 
' dg_Persons.Columns(ColIndex).Text = "" 
'dg_Persons.Columns(ColIndex).Value = "" 

     'Person_Edit dg_Persons.Columns(0).Value, dg_Persons.Columns(1).Value, dg_Persons.Columns(2).Value,dg_Persons.Columns(3).Value,dg_Persons.Columns(4).Value, dg_Persons.Columns(5).Value 

End Sub 

Private Sub dg_Persons_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As Variant, Cancel As Integer) 
    MsgBox ColIndex 
End Sub 



Private Sub dg_Persons_Click() 


If dg_Persons.Row <> -1 Then 
    dg_Persons.SelBookmarks.Add Me.dg_Persons.RowBookmark(dg_Persons.Row) 

    Selected_Person_Id = Val(dg_Persons.Columns(0).Value) 
End If 

End Sub 


Private Sub Form_Load() 

    ' dg_Persons.AllowUpdate = True 
    ' dg_Persons.EditActive = True 
    Call Persons_Read 

    dg_Persons.AllowAddNew = True 
dg_Persons.Columns(2).Locked = False 

End Sub 
Private Function Person_Edit(id As Integer, name As String, family As String, nickname As String, title As String, job As String) 


InitializeConnection 




cmd.CommandText = "Update person set [email protected] , [email protected] , [email protected] , title [email protected] , [email protected] where id= " & id & "" 
    cmd.Parameters.Append AddParam("name", name, adVarChar) 
    cmd.Parameters.Append AddParam("family", family, adVarChar) 
    cmd.Parameters.Append AddParam("nickname", nickname, adVarChar) 
    cmd.Parameters.Append AddParam("title", title, adVarChar) 
    cmd.Parameters.Append AddParam("job", job, adVarChar) 


    cmd.ActiveConnection = conn 
    cmd.CommandType = adCmdText 


    cmd.Execute 

End Function 
Private Function Person_Search(q As String) 
    Dim qry_all As String 


    qry_all = "SELECT * FROM person where person.name like '%" & q & "%' or person.family like '%" & q & "%' or person.nickname like '%" & q & "%'" 


    Call InitializeConnection 

    cmd.CommandText = qry_all 
    cmd.CommandType = adCmdText 

    Set cmd.ActiveConnection = conn 


    If conn.state = 1 Then 

     Set recordset = cmd.Execute() 

    End If 

     BindDatagrid 

End Function 

Private Sub mnu_About_Click() 
    frm_About.Show 
End Sub 

Private Sub submnu_exit_Click() 
    End 
End Sub 


Private Sub txt_Search_Change() 
    Person_Search txt_Search.Text 
End Sub 

답변

2

난 당신이 그리드 제어를위한 소스로 ADODC 컨트롤을 추가하여이 작업을 수행 할 수 있다고 생각합니다. 다음은이의 좋은 예는 다음과 같습니다

http://www.vbtutor.net/Lesson26.html

0

당신은 또한에 사용자를 할 수 있도록 당신이 순서대로 그리드에서 원하는 셀의 상단에있는 텍스트 상자를 배치 부동 텍스트 상자 컨트롤의 트릭을 사용할 수 있습니다 그리드의 데이터를 편집하십시오.

http://www.thescarms.com/vbasic/editgrid.aspx

0

나는이 대답은 꽤 오래 실현,하지만 단지의 경우 사람이 필요, 여기에 하나 개의 솔루션입니다. 기본적으로 데이터 환경 (그리고 실제로 표시 할 데이터를 지정하는 명령)을 통해 데이터 그 리드 내부에 표시 할 데이터를 가져와야합니다. 다음 문은 DataGrid1이라는 데이터 격자를 업데이트합니다. DataEnvironment1는 데이터 멤버 (명령) Command1. 포함하는 데이터 환경

DataEnvironment1.rsCommand1.Requery 
Set DataGrid1.DataSource=DataEnvironment1 

(rsCommand1은 자동 생성 Command1에 해당 ResultSet)를 예를 들어 당신은 당신의 업데이트에이 문을 넣을 수

그래서 버튼의 onClick 이벤트와 voila, datagrid 실시간으로 새로 고침!

0
Dim Para3, Para4 As String 
Para3 = "01-01-" & Combo1.Text 
Para4 = "31-12-" & Combo1.Text 
With DataEnvironment1 
If .Connection2.State <> 0 Then .Connection2.Close 
DoEvents 
.Connection2.Open 
.Command2 Para3, Para4 
Set DataGrid1.DataSource = .rsCommand2 
DataGrid1.ReBind 
End With 

쿼리를 사용하는 사이에 데이터가있는 레코드를 선택하려고했습니다. 처음에는 결과를 얻었지만 나중에는 새로 고치지 않았습니다. 이제 런타임에서 그리드가 해당 결과를 보여줄 때마다 모든 액션을 동적으로 수행 할 수 있습니다.

관련 문제