在 visual fox pro 中准确填充列表框
Populating a listbox accurately in visual fox pro
enter image description here我在填充列表框时遇到问题,例如,我想在 active = "1" 的位置填充它,以便显示 active = "1" 的数据和 active="0" 的数据仍然隐藏,
此列表显示猫名 "hey now" 和 "shiet",它们具有 active = "0":
我希望它们只在我的列表框中显示 active = 1
您可以使用 3 (SQL) 的 RowSourceType 并提供所需的 SQL 轻松地做到这一点。您可以根据需要在设计器中或代码中执行此操作。在设计 window 中,您使用 PEM sheet(Properties-Events-Methods window)来执行此操作,而不是构建器(不幸的是构建器没有 SQL 选项):
将 RowSourceType 设置为 3(SQL 语句)
将 RowSource 设置为:
select CatName, CategoryId 从 tbl_Category where Active="1" into cursor crsMyList
就是这样。当您 运行 您的表单时,它将仅列出 Active="1" 的类别名称(顺便说一句,如果 Active 字段是数字,则删除引号)。
您只需使用 crsMyList 别名即可获得 selected 行的值,例如:
selectedCategoryId = crsMyList.CategoryId
selectedCategoryName = crsMyList.CatName
作为另一个答案,您也可以在代码中执行此操作,实际上在代码中更容易。此外,当 SQL 很长时,您可能需要在代码中执行(属性 window 不允许您在那里输入长 SQL 字符串,限制为 255 个字符)。
下面是美国客户(示例中)代码清单中的完整示例:
Public oForm
oForm = CreateObject('MyForm')
m.oForm.Show()
Define Class myForm as Form
Height=440
Width=400
DataSession=2
Add Object lstCustomersInUSA as listbox with top=20, left=10, height=400, Width=200
Add Object btnShowSelectedInfo as CommandButton with Top=20, Left = 220,Caption="Show Selected"
Procedure lstCustomersInUSA.Init
this.RowSourceType = 3
Text to this.RowSource pretext 15 noshow
Select Company, Contact, Cust_id
from (_samples+'data\Customer')
where country = 'USA'
into cursor crsSample
nofilter
EndText
EndProc
Procedure btnShowSelectedInfo.Click
If thisform.lstCustomersInUSA.ListIndex = 0
MessageBox("None selectedyet")
Return
endif
Local lcInfo
Text to m.lcInfo textmerge pretext 3 noshow
Id: << crsSample.Cust_id >>
Company: << crsSample.Company >>
Contact: << crsSample.Contact >>
EndText
MessageBox( m.lcInfo, 0+4096, 'Selected Customer', 5000)
endproc
enddefine
注意:如果您想在设计器中使用表单对此进行测试,那么假设您添加了一个名为 "lstCustomersInUSA" 的列表框和一个名为 "btnShowSelectedInfo" 的按钮,请执行以下操作:
- 双击列表框和select 初始化方法。复制并粘贴上面 "Procedure lstCustomersInUSA.Init" 中的代码。
- 对按钮执行相同操作,并在其点击方法中复制并粘贴上述 "Procedure btnShowSelectedInfo.Click" 中的代码。
运行表格。
enter image description here我在填充列表框时遇到问题,例如,我想在 active = "1" 的位置填充它,以便显示 active = "1" 的数据和 active="0" 的数据仍然隐藏,
此列表显示猫名 "hey now" 和 "shiet",它们具有 active = "0":
我希望它们只在我的列表框中显示 active = 1
您可以使用 3 (SQL) 的 RowSourceType 并提供所需的 SQL 轻松地做到这一点。您可以根据需要在设计器中或代码中执行此操作。在设计 window 中,您使用 PEM sheet(Properties-Events-Methods window)来执行此操作,而不是构建器(不幸的是构建器没有 SQL 选项):
将 RowSourceType 设置为 3(SQL 语句)
将 RowSource 设置为:
select CatName, CategoryId 从 tbl_Category where Active="1" into cursor crsMyList
就是这样。当您 运行 您的表单时,它将仅列出 Active="1" 的类别名称(顺便说一句,如果 Active 字段是数字,则删除引号)。
您只需使用 crsMyList 别名即可获得 selected 行的值,例如:
selectedCategoryId = crsMyList.CategoryId
selectedCategoryName = crsMyList.CatName
作为另一个答案,您也可以在代码中执行此操作,实际上在代码中更容易。此外,当 SQL 很长时,您可能需要在代码中执行(属性 window 不允许您在那里输入长 SQL 字符串,限制为 255 个字符)。
下面是美国客户(示例中)代码清单中的完整示例:
Public oForm
oForm = CreateObject('MyForm')
m.oForm.Show()
Define Class myForm as Form
Height=440
Width=400
DataSession=2
Add Object lstCustomersInUSA as listbox with top=20, left=10, height=400, Width=200
Add Object btnShowSelectedInfo as CommandButton with Top=20, Left = 220,Caption="Show Selected"
Procedure lstCustomersInUSA.Init
this.RowSourceType = 3
Text to this.RowSource pretext 15 noshow
Select Company, Contact, Cust_id
from (_samples+'data\Customer')
where country = 'USA'
into cursor crsSample
nofilter
EndText
EndProc
Procedure btnShowSelectedInfo.Click
If thisform.lstCustomersInUSA.ListIndex = 0
MessageBox("None selectedyet")
Return
endif
Local lcInfo
Text to m.lcInfo textmerge pretext 3 noshow
Id: << crsSample.Cust_id >>
Company: << crsSample.Company >>
Contact: << crsSample.Contact >>
EndText
MessageBox( m.lcInfo, 0+4096, 'Selected Customer', 5000)
endproc
enddefine
注意:如果您想在设计器中使用表单对此进行测试,那么假设您添加了一个名为 "lstCustomersInUSA" 的列表框和一个名为 "btnShowSelectedInfo" 的按钮,请执行以下操作:
- 双击列表框和select 初始化方法。复制并粘贴上面 "Procedure lstCustomersInUSA.Init" 中的代码。
- 对按钮执行相同操作,并在其点击方法中复制并粘贴上述 "Procedure btnShowSelectedInfo.Click" 中的代码。 运行表格。