使用参数

时间:2015-09-04 12:31:30

标签: c# asp.net webforms user-controls

我创建了一个包含网格的UserControl

在主页面中,用户可以从组合中选择选项,然后,我需要为用户选择的每个选项生成UserControl

我有两个问题:

  1. 我需要将参数传递给用户控件以配置网格的数据源,但我不知道该怎么做。

  2. 如果我为test设置默认参数,当发生PostBack时,将删除用户控件。

2 个答案:

答案 0 :(得分:0)

我没有看到你的任何代码,所以我在这里给你一个简单的例子。

首先,为您需要传入的值定义一个属性:

public partial class SomeControl : System.Web.UI.UserControl
{
    public int AProperty { get; set; }

    ...
}

那么,从你需要使用用户控件的aspx开始,首先像往常一样注册它:

<%@ Register Src="~/MyControls/SomeControl.ascx" TagPrefix="my" TagName="SomeControl" %>

然后使用它,并将值传递给属性,如下所示:

<my:SomeControl runat="server" ID="SomeControl1" AProperty="1" />

您还可以从包含控件的aspx后面的代码中设置该属性,如下所示:

SomeControl1.AProperty = 1;

动态控件
您可以像这样动态创建此控件:

var ctrl = new SomeControl();
ctrl.AProperty = 1;

稍后将这些控件添加到<asp:PlaceHolder中的aspx

somePlaceHolder.Controls.Add(ctrl);

在回发时(即在下拉列表的selectedindexchanged上),该占位符内的所有控件都将消失,但信息仍在您的视图状态中,因此您需要做的就是在同一占位符内重新创建相应的控件viewstate中的旧值将附加到重新创建的控件。

答案 1 :(得分:0)

抱歉,我不发布代码。

用户控制

<div class="row panel">
<div id="datos" class="col-md-9">
    <telerik:RadGrid ID="gridDatos" runat="server" GroupPanelPosition="Top" AllowPaging="True" ShowGroupPanel="True"
        AllowSorting="True" ShowFooter="True" AllowFilteringByColumn="true" OnDataBound="gridDatos_DataBound" CellSpacing="-1" GridLines="Both">
....

UserControl代码

    public void SetDataSource(List<EntitiesInforme.SP.InformeProcesado> listaDatos)
    {
        gridDatos.DataSource = null;
        gridDatos.DataSource = listaDatos;
        gridDatos.MasterTableView.DataSource = listaDatos;
        gridDatos.DataBind();
    }

网页代码

protected void btnGenerarInforme_Click(object sender, EventArgs e)
        {
            int numeroSemana = 0;
            int estadoOperacion = 0;

            Int32.TryParse(comboNumeroSemanas.SelectedValue.ToString(), out numeroSemana);
            Int32.TryParse(comboEstadoOperacion.SelectedValue.ToString(), out estadoOperacion);

            if (numeroSemana <= 0 || estadoOperacion <= 0)
                return;

            lv.Controls.Clear();
            // Create an user control for each checked 
            foreach (var opcion in comboTipoOperacion.CheckedItems)
            {
                // Get data
                var datos = GetInforme(numeroSemana, Convert.ToInt32(opcion.Value), estadoOperacion);

                var di = (DatosInforme)LoadControl("/UserControls/DatosInforme.ascx");                        
                di.SetDataSource(datos);
                lv.Controls.Add(di);

            }
        }

如果我这样做,我会生成用户控件,但是,当回发完成时(例如,在网格中对列进行分组),用户控件将消失

由于