我用C#创建一个Windows窗体应用程序.
我有一个普通表格和一个小组.
我将subForm显示在此面板中,代码如下:
SubForm objForm= SubForm.InstanceForm();
this.IsMdiContainer = true;
objForm.TopLevel = false;
pnlSubSystem.Controls.Add(objForm);
objForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
objForm.Dock = DockStyle.Fill;
objForm.Show();
Run Code Online (Sandbox Code Playgroud)
现在我想在这个面板的subForm上显示其他形式,但我不知道该怎么做.
我使用子表单来显示查询的结果,但在记录的末尾有一个*(New)用于添加新记录的.我不希望用户能够通过此子表单添加新记录.我怎么能摆脱这个?
我有一个表格访问5个几乎相同的子表单.当我加载表单时,通常会很好.但是,我们最近从Access后端更改为SQL,从那时起,表单似乎无法正确加载.
如果我进入设计模式然后进入正常模式,一切都很好.然而,这不是一个可行的选择,用户不能这样做.
任何人都有这个问题或知道如何解决这个问题?
编辑问题的屏幕截图
1:这是第一个有效的
2:这个没有.
3:不过,如果我点击设计模式然后再次点击查看模式,我发现它起作用了,至少对于现存的一些:
谢谢
我读了这篇文章:http: //www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/
这非常有趣,而且运行正常.
我需要做同样但使用SubForm.我的意思是当用户按下按钮时,我通过ajax调用一个动作来添加,附加并向我现有的表单显示子表单.
例如:
我有一个表单,用户必须填写他孩子的姓名和姓氏,因此有一个"添加孩子"按钮.当用户按下该按钮时,应将SubForm添加到现有表单并显示.在提交时,它将验证与该文章中的示例完全相同.唯一的区别是,在那里他只添加一个字段.我需要添加一个SubForm,但方式完全相同.
我在我的行动中尝试了以下内容(由Ajax调用):
public function clonerecursivegroupAction()
{
$this->_helper->layout->disableLayout();
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('clonerecursivegroup', 'html')->initContext();
$id = $this->_getParam('id', null);
$subform1 = new Zend_Form_SubForm();
$Element1 = $subform1->createElement('text', 'text1');
$Element1->setLabel('text1')->setRequired(true);
$Element2 = $subform1->createElement('text', 'text2');
$Element2->setLabel('text2')->setRequired(false);
$subform1->addElement($Element1);
$subform1->addElement($Element2);
$this->view->field = $subform1->__toString();
}
Run Code Online (Sandbox Code Playgroud)
这几乎可行.
这个动作的视图返回SubForm的html代码,所以在我的ajax调用成功时我只显示它.
问题是,在提交时它会验证表单,但它丢失了刚刚添加的新子表单.只有一个元素的文章中不会发生这种情况.我想我只需要将SubForm添加到现有表单中,但是如何?
我已经构建了一个提交正常的表单,但是当我在控制器中查看它们时,子表单值在接收端都以null结尾.
这是我的UserProfileType表格,基于User课程.那么具体的,我们正在寻找在子窗体的subscriptionTier1,subscriptionTier1以及subscriptionTier1:
class UserProfileType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('firstName', TextType::class)
->add('lastName', TextType::class)
->add('email', EmailType::class)
// etc... I'll keep out the unimportant fields
// here are the subforms whose values show up as null on the back end
->add('subscriptionTier1', UserSubscriptionTierType::class, [
'required' => false,
'mapped' => false
])
->add('subscriptionTier2', UserSubscriptionTierType::class, [
'required' => false,
'mapped' => false
])
->add('subscriptionTier3', UserSubscriptionTierType::class, [
'required' => false, …Run Code Online (Sandbox Code Playgroud) 我有一个主要形式"属性",它有两个子表单,其中一个显示该属性中的房间,另一个显示每个房间的占用者.
当您更改属性时,房间会在第一个子表单中更改,这是连续的.当您向下滚动房间子窗体,使新房间处于活动状态时,我希望占用者在第二个子窗体中进行更改.
到目前为止,我已经在"属性"主要形式的Current事件中写了这个:
Dim dblRoomID As Double
dblRoomID = Forms.Properties.frmRoomsByPropertySubform.Form.room_id
Run Code Online (Sandbox Code Playgroud)
哪个成功从第一个子窗体中拉出Room_ID.
现在,我需要使用Room_ID在第二个子表单中设置过滤器,该子表单当前显示所有属性的所有占用者,但具有Room_ID字段.
我不能
Forms.Properies.frmStudentsRoomQuickview.Form.Filter = "[Room_ID]=" & dblRoomID
Run Code Online (Sandbox Code Playgroud)
或docmd.applyfilter工作 - 我一直在假设这是因为活动形式需要是'frmstudentRoomQuickview'以供后来工作 - 但我不明白为什么简单地设置.filter不会工作.
编辑:我应该添加,我不能在"房间"表格中使用子表格,因为房间形式需要连续.
编辑2:
Private Sub Form_Current()
Dim dblRoomID As Double
If IsNull(Forms.Properties.frmRoomsByPropertySubform.Form.room_id) Then
Forms.Properties.frmRoomsByPropertySubform.Visible = False
Forms.Properties.frmStudentsRoomQuickview.Visible = False
Else
Forms.Properties.frmRoomsByPropertySubform.Visible = True
Forms.Properties.frmStudentsRoomQuickview.Visible = True
dblRoomID = Forms.Properties.frmRoomsByPropertySubform.Form.room_id
Call frmStudentsRoomQuickview_Enter(dblRoomID)
End If
End Sub
Private Sub frmStudentsRoomQuickview_Enter(dblRoomID)
Forms.Properties.frmStudentsRoomQuickview.Filter = "[room_id] = " & dblRoomID
Forms.Properties.frmStudentsRoomQuickview.FilterOn = True
Forms.Properties.frmStudentsRoomQuickview.Requery
Debug.Print Screen.ActiveForm.name
End Sub
Run Code Online (Sandbox Code Playgroud)
我现在得到"程序声明与具有相同名称的事件或程序的描述"错误
在我的MS Access应用程序中,我使用的表单只包含两个控件 - 文本框和命令按钮.此表单命名为HEADER FORM.
HEADER FORM 用作各种其他形式的标题部分中的子表单.
我想要做的是,每当一个特定的表单加载时,我想在文本框中填写详细信息HEADER FORM(这将是已登录的人的名字.从下图中可以清楚地看到相同的内容).
我试图调用updateHeader在所有表单的表单加载事件中命名的全局子例程.
Public Sub updateHeader()
Me![HEADER FORM].Form.txtHeaderName.Value = strPerson
End Sub
Run Code Online (Sandbox Code Playgroud)
以下是HEADER FORM在"设计视图"中显示的图片,同样用作登录表单中的子表单.

我尝试了各种其他选项,但我无法提出正确的方式来引用表单.我从根本上做错了吗?
我看到的错误是无效使用Me关键字.此外,我的updateHeader子例程是一个全局子程序,它从所有表单的Form_Load事件中调用.
我在主窗体上有 2 个子窗体。Sub_2 在列表中显示在 sub_1 中选择的项目的详细信息。对于这两个子表单,我使用 continue 表单,它们被限制为 2 个查询,有一个公共字段,比如“id”。
我所做的是在 sub_1 上的 DClick 事件中添加代码来设置 sub_2 的过滤器,如
Me.Parent.sub_2.Form.Filter = "id=" & "'" & Me.Recordset!id & "'"
Run Code Online (Sandbox Code Playgroud)
然后重新查询
Me.Parent.sub_2.Form.Requery
Run Code Online (Sandbox Code Playgroud)
但是没有运气,当我双击 sub_1 中的记录时,sub_2 中没有变化。我看过相关问题,我认为这应该有效......
有什么建议?也许我应该使用其他方法来做到这一点?
PS:我确定Me.Parent.sub_2.Filter已更改,但重新查询不起作用。
编辑:
感谢您的回答。我发现了问题,即'id'字段在查询中,但它没有显示在子表单上,所以可能Access无法使用它。
当过滤器更改时,Access 会自动重新查询。
我正在尝试在数据表视图中的access07子表单中显示ADO记录集.只是一个快照,只读.连接成功,记录集包含数据,但是,当我设置子表单记录集时,不显示任何字段.子窗体显示一个垂直滚动条,当滚动到底部时,它表示正确的记录数,但它没有显示任何字段,没有显示任何列.
这一定很简单,我很想念.有任何想法吗?
编辑:这是建立记录集的代码的摘要.
Set cn = New ADODB.Connection
Set rsADO = New ADODB.Recordset
dbBackend = "C:\Users\Me\Desktop\TEST_Db_Backend.accdb"
sqlStr = "SELECT * FROM tblMaster;"
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbBackend & ";User Id=;Password=;"
cn.CursorLocation = adUseClient
cn.ConnectionString = strConnect
cn.Open
If cn.State = adStateOpen Then
rsADO.Open sqlStr, cn, adOpenStatic, adLockReadOnly
End If
Set Me.PreviewPane.Form.Recordset = rsADO
rsADO.Close
cn.Close
Set rsADO = Nothing
Set cn = Nothing
Run Code Online (Sandbox Code Playgroud) 我正在编辑一个旧的MS Access应用程序,其中一个表单包含一堆子表单.子表单都包含静态定位的对象,不应滚动.
我的问题是,如果用户选择一个TextBox朝向子窗体的底部并开始编辑它,窗体会自动滚动以使TextBox更接近顶部,这基本上会切断窗体的顶部.
如何禁用此行为?