refresh на форма, help!

5 отговора 115 прегледа
#1

refresh на форма, help!

Здравейте. Проблема ми е следния. Имам форма, в нея бутон. Бутона извиква модална форма, като в нея се въвеждат данни, и се ъпдейтва базата. Трябва ми след като затворя модалната да се рефрешне долната форма, с вече редактираните данни от базата....не знам как да го направя
Моля, ако някой знае как ще стане, да ми помогне

Don't cry because it is over, smile because it happened.
Отговор
в отговор на Дopoти #2

Re: refresh на форма, help!

Ами, сещам се за лесен начин, който даже би трябвало да работи, но няма как да знам какъв ти е кода, и ще пиша ей така наслуки.

В кода на формата "отдолу", дето вика модалната - правиш една Public Sub Refresh(), която се използва за зареждане на данните от базата. Т.е. в тази процедура да ти е кода за четене... В кода на модалната форма - описваш в събитието Form_Unload(Cancel As Integer) просто един ред frmMain.Refresh без параметри, ако не си писал изрично (frmMain го давам за пример като име на формата "отдолу"), и така при затваряне на модалната форма - ще се изпълни процедурата от главната форма.

Ако така не те устройва - пиши по-подробно за какво иде реч, и евентуално постни част от кода, да се ориентираме.


Щирлиц
Отговор
в отговор на Щиpлиц #3

Re: refresh на форма, help!

Мерси за отговора, сега ще пробвам

Don't cry because it is over, smile because it happened.
Отговор
в отговор на Дopoти #4

Re: refresh на форма, help!

след като се затвори модалната форма напиши името на формата която искаш да се рефрешне и след това refresh. Ето така:

Private Sub Fорм_Unload(Cancel As Integer)
frmOne.Refresh
End Sub

и така като изчезне от паметта формата ще каже какво да прави другата форма която сте въвели (frmOne) малко преди нейното ънлоадване...

Успех

Отговор
в отговор на Kristian #5

Re: refresh на форма, help!

data1.updatecontrols

Отговор
в отговор на jethro #6

Re: refresh на форма, help!

Да, прав си, но само ако работи с контрола Data. А ако ползва DAO например - това няма да му свърши никаква работа.

Ама и аз съм едно говедо... то .Refresh си е метод на формата. Значи в по-горния пример процедурата трябва да се именува някак, че да не съвпада името и със съществуващи медоди или свойства. Ето например така:


'Код във главната форма

Dim dbDAO As DAO.Workspace
Dim dbBase As DAO.Database
Dim dbTableData As DAO.Recordset

Private Sub Form_Load()
Set dbDAO = DAO.Workspaces(0)
Set dbBase = DAO.OpenDatabase("c:\Data.mdb")
Set dbTableData = DAO.OpenRecordset("Data", dbOpenDynaset)

GetData

End Sub

Public Sub GetData()
txtDate.Text = dbTableData!Date
txtName.Text = dbTableData!Name
txtAddress.Text = dbTableData!Address
End Sub

Public Sub PutData()
dbTableData!Date = txtDate.Text
dbTableData!Name = txtName.Text
dbTableData!Address = txtAddress.Text
End Sub


'.........................................

'Код във модалната форма

Private Sub Form_Unload(Cancel As Integer)
frmMain.GetData
End Sub



Примера е за DAO, като за да се дефинират променливите с DAO - е нужно да се реферира от меню Project - References - Microsoft DAO 3.51, и след това ще са активни в проекта свойствата на DAO.

Защо DAO, а не контрола Data?
Защото с DAO имаме доста по-голяма гъвкавост за управление на базата данни. Полетата в базата не се асоциират с визуални контроли, а може да се търси по критерии, променя, мести, и т.н. информацията в базата чрез чисто програмен код. Аз лични предпочитам да унифицирам програмата с работата с база данни, защото така от програмистка гледна точка - по-трудно ще изпусна някое поле да го ъпдейтвам, или промените по програмния код ще стават много по-лесно.

Да поясня за какво унифициране става дума.
В дадена форма имам наредени TextBox - неизвестно количество. Някои от тях ще са "свързани" да показват данни от базата. Но докато се въвеждат данните - аз не искам да се пипа базата, за да може да се "върне" старото състояние на полетата, ако се окаже, че нещо не е както трябва. Също така искам данните да минават през процедура, която проверява въведените данни, и ако нещо не съответства - въобще да не се пипа записа в базата. Тогава аз правя тези неизвестни на брой TextBox по формата, нареждам си ги както е най-удобно за визуалния интерфейс, и именувам полетата, които ще покзват данни от базата с едно и също име. Например избирам името t. Само че техните индекси стават от 0 до колкото са полетата - 1. Индексите всъщност не ме интересуват много, именувам ги така, за да не се объркам кои полета за какво са. Но за всяко от тях поотделно аз задавам свойството им .Tag = името на съответното поле от базата. Например таблицата в базата има полета dbDate, dbName, dbAddress. Тогава същите имена ги записвам като тагове на текстовите контроли. ;о))) Засега не виждате смисъл от всичко, но... Пиша в кода на формата две кратки процедури. Една за четене на данните от базата, и една за запис, като те си приличат по начин на работа, само че данните се обработват в "различна посока". Нещо такова:

'Примера го пиша на "сухо" без самото VB. Моля да ме извините,

'ако има правописна грешка някъде.
Private Sub PutData()
Dim ctl As TextBox
dbTableData.Edit
For Each ctl In frmMain
If left(ctl.Tag, 2) = "db" then
dbTableData.Fields(ctl.Tag) = ctl.Text
End If
Next
dbTableData.Update
End Sub


С този код приключвам с "връзването" на данните от базата към полетата, и процедурата обхождайки frmMain, няма да пропусне поле. Ако се наложи да добавя поле в таблицата с данни, за мен ще е нужно през Design да добавя нов визуален контрол, да му сложа Tag, който съответства на поле от базата данни, и той вече работи без да пипам нищо по програмния код. Другото удобство е, че нищо не ми забранява да записвам по други полета от таблицата някакви други данни, като например името на потребителя, който е извършил промените, и т.н. неща, без те да се появяват в текстови контроли.

Някой може да каже, че това обхождане на всички текстови полета по формата е излишно, и се губят излишно процесорни ресурси... Да, така е, но имайки поглед върху нещата - бих запитал на една форма, която се събира в екрана - колко текстови полета може да събере човек? Пък и колко пъти в секундата оператора пред компютъра може да въведе нови данни в полетата, и да натисне "Запис", за да се направи обхождане на полетата отново... ;о)

Начини има много. Важното е да намерим вариант, който не е бавен, и в същото време е сигурен от програмистка гледна точка - да е стабилна програмата, и да не дава грешки.


Щирлиц
Отговор