你能用C#在ASP.NET中发起回发吗?

你能用C#在ASP.NET中发起回发吗?,c#,asp.net,treeview,postback,C#,Asp.net,Treeview,Postback,根据研究,我的问题的答案似乎是响亮的否定 从和来看,似乎唯一的方法就是使用JavaScript。可悲的是,我没有必要的技能水平来实施他们的解决方案,我也不完全确定它是否适合我的情况。看看你怎么想: 我拥有的(在VS2019中使用asp.net和C#)是一个treeview控件,它: 1.1在第一级,显示客户的名称 1.2展开客户节点,下一级显示该客户的销售订单号列表 1.3展开“销售订单”节点,第三级即最后一级显示属于该特定销售订单的销售项目列表 我可以想象,这是相当标准的东西。现在,另一个

根据研究,我的问题的答案似乎是响亮的否定

从和来看,似乎唯一的方法就是使用JavaScript。可悲的是,我没有必要的技能水平来实施他们的解决方案,我也不完全确定它是否适合我的情况。看看你怎么想:

我拥有的(在VS2019中使用asp.net和C#)是一个treeview控件,它:

  • 1.1在第一级,显示客户的名称
  • 1.2展开客户节点,下一级显示该客户的销售订单号列表
  • 1.3展开“销售订单”节点,第三级即最后一级显示属于该特定销售订单的销售项目列表
我可以想象,这是相当标准的东西。现在,另一个标准是,当点击一个节点时,一个过程将使一个formview可见,其中显示关于该对象的信息。单击客户节点时,将显示customer formview。单击销售订单节点时,将显示销售订单formview。单击销售项目节点时。。。你大概可以猜到它会显示什么

这就是事情开始偏离轨道的地方。单击节点时,其Value属性存储在名为_id的变量中。该变量随后存储在ViewState中。当回发发生时,我们的想法是Page_Load事件将从ViewState读取_id的值,运行showFormViews()过程并显示相关的formview。我是这样安排的:

protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["_id"] == null)
    {
        _id = "";
    }
    else
    {
        _id = Convert.ToString(ViewState["_id"]);
    }
    if (!IsPostBack)
    {
        fillTreeView;
        tv.CollapseAll();
    }
    showFormViews();
}
单击节点时:

protected void tv_SelectedNodeChanged(Object sender, EventArgs e)
{
    // (a) PostBack occurs and Page_Load is run *before* _id is set and stored in ViewState
    _id = tv.SelectedNode.Value;
    ViewState.Add("_id", _id);
    showFormViews();
    // (b) would be great to be able to fire off a PostBack programmatically right here!
}
(aspx标记只是一个树状视图和三个链接到ObjectDataSources的FormView)

我现在从以下方面了解到:

“页面生命周期的初始化部分将在 导致回发的控件的事件处理程序。因此 页面的Init和Load事件处理程序中的代码将在 事件处理程序中用户单击的按钮的代码。“

如上文第(a)行所述,当单击treeview节点时,页面将被发回,页面加载将在页面id仍然为空时运行。由于_id为null,showFormViews()过程将隐藏所有FormView

然后触发SelectedNodeChanged事件,设置id,ShowFormView()过程将相关formview设置为可见。但当然,现在所有的控件都被渲染了,所以。。。什么也没发生

能够以某种方式在第(b)行发起回发将非常有效。Page_Load将启动并运行showFormViews(),但这一次_id是它应该的

第(b)行的各种变化:

不工作是因为它们破坏了ViewState(除非有人知道不同的情况?),所以_id再次变为null

因此,如果你不能用C#启动回发,如果我不能通过上面的两张海报(或者即使它们在这种情况下是合适的)解决方案,我有没有办法重新构建页面,使这一点——我可以想象这是一种相当常见的模式——起作用(请不要建议MVC——我试着学习了,但仍然做噩梦!)


非常感谢,

您可以在页面中调用用于填充视图状态的方法…如:

    protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["_id"] == null)
    {
        _id = "";
    }
    else
    {
        _id = Convert.ToString(ViewState["_id"]);
        tv_SelectedNodeChanged(null, null);
    }

    if (!IsPostBack)
    {
        fillTreeView;
        tv.CollapseAll();
    }
} 

您可以在PageLoad中调用用于填充ViewState的方法…如:

    protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["_id"] == null)
    {
        _id = "";
    }
    else
    {
        _id = Convert.ToString(ViewState["_id"]);
        tv_SelectedNodeChanged(null, null);
    }

    if (!IsPostBack)
    {
        fillTreeView;
        tv.CollapseAll();
    }
} 

回发只不过是前端代码触发页面的重新加载,运行
页面加载
和aspx中指定的方法。因此在C#代码中,您可以始终执行
按钮1_单击(null,null);
电视选择的nodeChanged(null,null)
来自代码中的某个地方。或者我非常误解了这个问题…嗨,VDWWD,不,你可能没有误解这个问题。我想我误解了这个问题。我不知道为什么,但它刚刚开始工作。我不知道它怎么可能…但它确实可以,这对我来说已经足够好了!非常感谢您的评论和支持我不知道你可以调用Button1_Click(null,null)这样的事件,所以我也在那里学到了一些东西。回发只不过是前端代码触发页面重新加载,运行
page_Load
和aspx中指定的方法。所以在C#code中,你总是可以执行
Button1_Click(null,null)
tv\u选择的节点更改(空,空)
来自代码中的某个地方。或者我非常误解了这个问题…嗨,VDWWD,不,你可能没有误解这个问题。我想我误解了这个问题。我不知道为什么,但它刚刚开始工作。我不知道它怎么可能…但它确实可以,这对我来说已经足够好了!非常感谢您的评论和支持我不知道你可以调用Button1\u Click(null,null)这样的事件;所以我在那里也学到了一些东西。嗨,雷纳托,正如我在回复VDWWD上面的评论时所写的那样,它突然开始工作了,我看不出有什么好的理由!非常感谢你的评论,并为我展示了一种方式来调用一个我以前不知道的事件。嗨,雷纳托,正如我在回复VDWWD上面的评论时所写的,它是suddenly所有人都开始工作,我看不出有什么好的理由!非常感谢你的评论,也感谢你给我展示了一种方式来召集我以前不知道的活动。