Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在FormView中,如何更改ItemTemplate中标签的属性?_Asp.net_Data Binding - Fatal编程技术网

Asp.net 在FormView中,如何更改ItemTemplate中标签的属性?

Asp.net 在FormView中,如何更改ItemTemplate中标签的属性?,asp.net,data-binding,Asp.net,Data Binding,在ASP.NET中,我有一个绑定到ObjectDataSource的FormView。FormView有一个带有删除按钮的ItemTemplate和一个标签。我正在处理FormView的OnItemDeleted事件,以检测我的业务类在删除时是否引发异常。如果检测到异常,我会将标签文本更改为异常消息的任何内容 好吧,只是不起作用 我可以很好地检测到异常,但标签的文本从未更改。重新加载页面时,默认文本保持不变。在分配新文本后,我还尝试使用DataBind()重新绑定FormView,但它也不起作用

在ASP.NET中,我有一个绑定到ObjectDataSource的FormView。FormView有一个带有删除按钮的ItemTemplate和一个标签。我正在处理FormView的OnItemDeleted事件,以检测我的业务类在删除时是否引发异常。如果检测到异常,我会将标签文本更改为异常消息的任何内容

好吧,只是不起作用

我可以很好地检测到异常,但标签的文本从未更改。重新加载页面时,默认文本保持不变。在分配新文本后,我还尝试使用DataBind()重新绑定FormView,但它也不起作用

在追踪问题的绝望尝试中,我将标签从FormView中取出,它工作正常

我做错了什么

ASPX页面:

<asp:ObjectDataSource ID="MyObjectDataSource" 
    TypeName="MyScopeRepository" 
    SelectMethod="GetById"
    DeleteMethod="Delete"
    runat="server">

    <SelectParameters>
        <%-- The id param here is from a DropDownList, not included in the example for clarity. --%>
        <asp:ControlParameter Name="id" Type="Int32" ControlID="MyDropDownList" PropertyName="SelectedValue" />
    </SelectParameters>
    <DeleteParameters>
        <asp:Parameter Name="id" Type="Int32" />
    </DeleteParameters>
</asp:ObjectDataSource>

<asp:FormView ID="MyFormView" DataSourceID="MyObjectDataSource"
    RenderOuterTable="false"
    DataKeyNames="Id"
    OnItemDeleted="MyFormViewItemDeleted"
    runat="server">

    <ItemTemplate>
        <asp:Button CssClass="Button Small" Text="Delete" CommandName="Delete" runat="server" /><br />
        <asp:Label ID="ErrorLabel" Text="Default text" runat="server" />
    </ItemTemplate>
</asp:FormView>
非常感谢

编辑:我在单击删除按钮时检查了FormView触发的所有事件,下面是我得到的:

  • 奥尼特
  • 制造
  • 装载
  • 奥涅姆坎德
  • OnItemDeleting
  • 删除
  • 制造
  • 昂达邦
  • 预渲染
  • 昂洛德
  • 所以我们可以看到,OnItemCreated被激发了两次,第二次激发是在OnItemDeleted之后,这意味着我所做的任何更改都会被覆盖,我想。现在我该如何处理这个问题呢?

    这是一个有效的解决方案(您可能需要改进它):


    一种方法是向数据源对象添加另一个公共字段,称为“Error”,然后在
    myformviewitemdelected
    中更改正确的值并重新绑定FormView


    就我所知,它应该可以工作,尽管可能有更简单/更简单的方法。

    下面是我在稍微修改代码后的做法。在代码隐藏中,在类中声明了一个字段:private string str_feedbackmsg

    try
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand(dbcmd, cnn);
            cmd.ExecuteNonQuery();
    
            str_feedbackmsg = "Database Work Done!";
        }
        catch (SqlException err)
        {
    
            str_feedbackmsg = "Database Error: Please Notify the Site Administrators.";
        }
        finally
        {
            cnn.Close();
        }
    
    然后在FormView的数据绑定事件中:

    protected void gv_main_DataBound(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            Label l = fv_main.FindControl("lbl_feedback") as Label;
            l.Text = str_feedbackmsg;
        }
    }
    

    @md1337检查执行是否进入带有断点的循环…它是否存在于表单视图中,如网格视图中的数据绑定事件?@Pandiya-什么循环?我已经验证了执行是否到达MyFormViewItemDeleted,特别是errorLabel.Text行,如果这是您的意思的话。@Andrew-对不起,我不明白。我没有使用form view,但使用grid view时做得非常好。每次更改网格时,网格视图数据绑定将绑定整个数据源。所以我想为什么不能在form view中使用ondatabound事件也可以达到同样的目的。在OP中,我提到我尝试了这一点,并且它是有效的,但是我需要FormView中字段下的错误消息。我想这与在代码隐藏类中添加一个私有变量来保存消息一样,直到我们到达ItemCreated事件为止,在这一点上,我将粘贴到标签的消息。我不喜欢这个解决方案。感觉上我在用一些MacGyver代码绕过ASP.NET,但我看不到任何其他方法。@md-也看不到任何其他方法。。希望有人能带来一些东西。:)
    public string MyProperty { get; set; }
            protected void FormView1_DataBound(object sender, EventArgs e)
            {
                if (!string.IsNullOrEmpty(MyProperty))
                {
                    Label l = FormView1.FindControl("Label1") as Label;
                    l.Text = "it works. " + MyProperty;
                    MyProperty = null;
                }
            }
    
            protected void FormView1_ItemDeleted(object sender, FormViewDeletedEventArgs e)
            {
                if (e.Exception != null)
                {
                    MyProperty = e.Exception.Message;
                    e.ExceptionHandled = true;
                }
            }
    
    try
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand(dbcmd, cnn);
            cmd.ExecuteNonQuery();
    
            str_feedbackmsg = "Database Work Done!";
        }
        catch (SqlException err)
        {
    
            str_feedbackmsg = "Database Error: Please Notify the Site Administrators.";
        }
        finally
        {
            cnn.Close();
        }
    
    protected void gv_main_DataBound(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            Label l = fv_main.FindControl("lbl_feedback") as Label;
            l.Text = str_feedbackmsg;
        }
    }