Кнопка «Добавить» в окне сетки динамически заполняется: событие не срабатывает - PullRequest
0 голосов
/ 20 марта 2012

Я работаю несколько раз над этими функциями, но также не работаю вообще. Я заполняю вид сетки по коду и добавляю кнопку, которая при щелчке открывает деталь строки.

Я пытаюсь добавить кнопку, пока она заполнена данными, но не работает. После того, как я пытаюсь добавить кнопку на метод row_databound; кнопка, которая рендерит, но не запускает событие щелчка.

Как следует за упрощенным кодом. Я надеюсь, что вы сможете помочь мне решить эту проблему.

Спасибо заранее и с уважением. P

protected void btnSearch_Click(object sender, EventArgs e)
{
    string sSearchQuery = "(" + TextBox1.Text + ")";
    loadDynamicGrid(sSearchQuery);
}

private void loadDynamicGrid(string sSearchQuery)
    {
        //search
       .....     
       var oHitColl = searcher.Search(oParser.Parse(sSearchQuery));

        //istance of DataTable
        gvResult.Columns.Clear();
        gvResult.DataSource = null;

        DataTable dt = new DataTable();


        DataColumn dcol = new DataColumn("Id", typeof(System.String));
        dt.Columns.Add(dcol);
        dcol = new DataColumn("Table", typeof(System.String));
        dt.Columns.Add(dcol);
        dcol = new DataColumn("Summary", typeof(System.String));
        dt.Columns.Add(dcol);
        dcol = new DataColumn("Link", typeof(System.String));
        dt.Columns.Add(dcol);
        dcol = new DataColumn("Button", typeof(Button));
        dt.Columns.Add(dcol);


        //Populate la datatable
        for (int i = 0; i < oHitColl.Length(); i++)
        {
            Document oDoc = oHitColl.Doc(i);

            DataRow drow = dt.NewRow();
            drow["Table"] = oDoc.Get("Table");
            drow["Summary"] = oDoc.Get("Summary");
            drow["Id"] = oDoc.Get("Id");
            string url = ....".aspx";
            drow["Link"] = linkText;
            //Button btn = CreateButton("dinamicBtn" + i.ToString(), "dinamicBtn" + i.ToString());
            //drow["Button"] = btn;
            dt.Rows.Add(drow);
        }

        // add columus in GridView
        foreach (DataColumn col in dt.Columns)
        {
            //Dichiarare i campi bindati e allocare la memoria che serve
            BoundField bfield = new BoundField();
            bfield.DataField = col.ColumnName;
            bfield.HeaderText = col.ColumnName;
            gvResult.Columns.Add(bfield);

        }

        gvResult.DataSource = dt;
        gvResult.DataBind();
        searcher.Close();
    }

protected void gvResult_RowDataBound(object sender, GridViewRowEventArgs e)
{
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Button btn = new Button();
            btn = CreateButton("btnOpen_"+ e.Row.RowIndex.ToString(), "Open");
            btn.DataBinding +=new EventHandler(btn_DataBinding);
            e.Row.Cells[e.Row.Cells.Count - 1].Controls.Add(btn);

        }
    }

private Button CreateButton(string id, string name)
{       
    Button b = new Button();
    b.Text = name;
    b.ID = id;
    b.Click += new EventHandler(Dynamic_Method);
    b.DataBinding += new EventHandler(btn_DataBinding);
    return b;
}

private void btn_DataBinding(object sender, EventArgs e)
    {
        object bound_value_obj = null;
        Control ctrl = (Control)sender;
        IDataItemContainer data_item_container = (IDataItemContainer)ctrl.NamingContainer;
        bound_value_obj = DataBinder.Eval(data_item_container.DataItem,"gvResult.Rows.Count.ToString()");
    }

protected void Dynamic_Method(object sender, EventArgs e)
{
    Response.Write("You have clicked at: "+DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"));
}

1 Ответ

0 голосов
/ 20 марта 2012

Любой элемент управления, который вы создаете динамически, необходимо повторно добавлять при каждой обратной передаче, события должны быть перехвачены при каждой обратной передаче и т. Д. Кроме того, вы должны сделать это в методе OnInit .

...