这是对早期问题的跟进,我提供了自己的答案,但在这个过程中有一个新的皱纹,我正在寻找答案。
情境:
将asp.TextBox嵌入到asp.FormView控件中。先前的问题是我无法从后面的代码填充TextBox(C#)。通过将 AutoPostBack =“true”添加到TextBox来更正此问题。
问题:
回发更正了文本框的填充,但现在必须执行控制分配的两次传递才能看到填充的文本框。
具体问题
如何纠正这一点,因此不需要再次单击该按钮即可查看填充的文本框。
代码示例:
/*-- This is the fragment of code in the aspx which is related to the issue: --*/
<asp:FormView runat="server" ID="EditImpStndPreamble" DataSourceID="ImpStndPreambDS" OnItemCommand="EditImpStndPreamble_ItemCommand" DefaultMode="Edit" DataKeyNames="ARS_Index">
<InsertItemTemplate>
<asp:Label runat="server" Font-Size="Small" Font-Bold="true" Width="60" Text="Index #"></asp:Label>
<asp:Label Text='<%# Eval("ARSEL_Index") %>' runat="server" ID="ARSEL_IndexLabel1" Width="74" />
<asp:Label runat="server" Width="60" Font-Size="Small" Font-Bold="true" Text="Control #"></asp:Label>
<asp:TextBox Text='<%# Bind("ARSControlNum") %>' runat="server" ID="ARSControlNumTextBox" Width="74" />
<asp:LinkButton runat="server" Text="Insert" CommandName="Insert" ID="InsertButton" CausesValidation="True" /> <asp:LinkButton runat="server" Text="Cancel" CommandName="Cancel" ID="InsertCancelButton" CausesValidation="False" />
</InsertItemTemplate>
</asp:FormView>
// This is the fragmentof code in the C# code behind related to the issue
// This is where we update the control number
Label ctrnum = (Label)EditElementsFV.Row.FindControl("ARSControlNumLabel");
if (ctrnum != null)
ctrnum.Text = Session["CurrentControl"].ToString();
欢迎任何见解。我已经尝试了几件事,但还没有找到一种方法让我的工作像我想要的那样。我在想是否可以触发只有TextBox控件的第二个回发来解决它。问题是从代码后面执行回发的每种方法似乎都重置了默认情况下此FormView不可见的页面。
此致
更新时间:03/24/17 1:06 PM美国中部:
我从这个问题中稍稍休息一下,开始研究项目的另一部分。我尝试了更多的东西,但我做的最后一件事是通过调试器跟踪几个变量,并在我逐步完成代码的相关部分时检查代码的流程。
对于双击问题,我发现第一次单击“插入实现标准”按钮时,执行通过FormView的“项模板”进行路由,然后在停止之前运行“插入模板”。
相反,第二次按下按钮就像我预期的那样执行,并且只执行了'FormView的插入模板。
我还观察到在执行FormView的项目模板和/或插入模板之前,正确填充了与FormView相关的DataSource中使用的所有变量。
所以,我最初遇到这个更令人费解,因为起初我所处理的只是缺少两个TextBox的可见性,但是现在我们对执行项目模板的代码有好奇心了。在浏览插入模板之前使用FormView 肯...
更新时间:03/27/17美国中部时间上午9:55 我一直在研究这个问题并搜索我可以利用的类似问题的示例,因此现在尝试使用FormView.ItemInserting块(在实际执行'insert'之前被绕过)和FormView.DataBound块。 DataBound能够触发,但我必须在条件'if(IsPostBack)'中包含块以避免触发空引用错误。这通过块正确地路由但是屏幕绘制的结果与未按预期填充的字段相同。这是上次尝试的最后一个块:
protected void EditElementsFV_DataBound(object sender, EventArgs e)
{
if (IsPostBack)
{
Label ctrnum = (Label)EditImpStndPreamble.Row.FindControl("ARSControlNumLabel");
if (ctrnum != null)
ctrnum.Text = Session["CurrentControl"].ToString();
Label famlbl = (Label)EditImpStndPreamble.Row.FindControl("ColumnTagLabel");
if (famlbl != null)
famlbl.Text = Session["CurrentFamily"].ToString();
}
}
按下,但真的可以使用其他一些眼睛。
更新:03/29/17美国中部时间上午7:42
我想昨天发布这个更新,但是在一个不同的项目中被拉了一段时间。我最近尝试解决这个问题,我确信它会起作用。但是,在第二次选择按钮之前,它也无法将值加载到论坛的插入模式中。
它的作用来自FormView中'DataBound'的触发器,它将流指向函数FillDefaultValue,该函数将默认值分配给控制TextBox显示的FormView中的两个参数。
在我看来,这个'应该'解决了这个问题,因为默认值将是Session变量中包含的值,而不是空白(null)。
public void FillDefaultValueInFormView()
{
if (EditElementsFV.CurrentMode == FormViewMode.Insert)
{
EditElementsDS.SelectParameters["ARSControlNum"].DefaultValue = Session["CurrentControl"].ToString();
EditElementsDS.SelectParameters["ColumnTag"].DefaultValue = Session["CurrentColumn"].ToString();
}
}
protected void EditElementsFV_DataBound(object sender, EventArgs e)
{
if (IsPostBack)
{
FillDefaultValueInFormView();
}
}
所以神秘感继续......
答案 0 :(得分:0)
我最终使用问题中定义的函数FillDefaultValueInFormView()来解决这个问题。
我一遍又一遍地观看流程,并意识到发生了什么,当我将FormView的模式设置为Insert时,它正在刷新我放置在TextBox上的值赋值。
然后我意识到我需要做的是将DataSource中的默认值分配给TextBox中的所需内容&#39;之前&#39;将FormVeiw的模式设置为Insert。所以,我在Button_click事件的早期部分添加了对函数的调用,然后立即将FormView的模式更改为Insert。
protected void AddImpStadBTN_Click(object sender, EventArgs e)
{
Session["CurrentColumn"] = "IMP";
FillDefaultValueInFormView();
EditElementsFV.ChangeMode(FormViewMode.Insert);
... More code follows to complete this but left off as it doesn't effect the results...
}
执行此操作后,对FormView上的插入模式的更改已成功预先填充,正如我为用户所预期的那样。我现在将它们更改为ReadOnly,这样用户就无法更改它们,从而使它们成为表单中编程驱动的字段。