ASP.Net, получить значение CheckBox из динамически создаваемых Gridviews - PullRequest
0 голосов
/ 28 октября 2018

Я искал ответы на мою проблему, но ничего не нашел, поэтому мне нужна ваша помощь, пожалуйста!

У меня есть страница, которая может иметь 1-много видов сетки, динамически создаваемых в зависимости оттребований и добавляется к серверной стороне div в качестве дочернего элемента управления.

ASPX:

        <div ID="DivStreams" runat="server">
        </div>

Код сзади:

                // gridview
                GridView gv = new GridView
                {
                    ID = "gridFiles_" + stream.Part,
                    CssClass = "gridview",
                    EmptyDataText = "There are no files in this stream",
                    AutoGenerateColumns = false,
                    DataKeyNames = new string[] { "FileID", "PrismPart" },
                    ShowFooter = true
                };
                gv.RowDataBound += gridFiles_RowDataBound;

                -- more css styling here, removed to shorten message --


                // gridview columns
                gv.Columns.Clear();
                gv.Columns.Add(new BoundField() { HeaderText = "Print Filename", DataField = "PrintFilename" });
                gv.Columns.Add(new BoundField() { HeaderText = "Envelopes", DataField = "Envelopes" });
                gv.Columns.Add(new BoundField() { HeaderText = "Sheets", DataField = "Sheets" });
                gv.Columns.Add(new BoundField() { HeaderText = "Status", DataField = "Status" });
                gv.Columns.Add(new TemplateField() { ItemTemplate = new GridDmChangeStream(), HeaderText = "Change Stream" });
                DivStreams.Controls.Add(gv);

                // bind
                gv.DataSource = stream.Files;
                gv.DataBind();

    protected void gridFiles_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        List<DmStream> streams = ((List<DmStream>)ViewState["streams"]);

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DropDownList ddl = (DropDownList)e.Row.FindControl("ddlPrismPart");
            Dictionary<int, string> partsAndNames = new Dictionary<int, string>();
            partsAndNames.Add(0, "");
            foreach (DmStream stream in streams)
            {
                if (!stream.Locked && stream.Part != 0 && e.Row.NamingContainer.ID != "gridFiles_" + stream.Part) 
                    partsAndNames.Add(stream.StreamID, "Part " + stream.Part + " - " + stream.StreamName);
            }
            partsAndNames.Add(-1, "Cancel File");
            ddl.DataSource = partsAndNames;
            ddl.DataBind();
            if (e.Row.NamingContainer.ID == "gridFiles_0")
            {
                ddl.CssClass += " missingDetails";
                btnManageJob.Enabled = false;
            }
            ddl.SelectedIndexChanged += ddlChangeStream_SelectedIndexChanged;
        }

        if (e.Row.RowType == DataControlRowType.Footer)
        {
            foreach (DmStream stream in streams)
            {
                if (e.Row.NamingContainer.ID == "gridFiles_" + stream.Part)
                {
                    e.Row.Cells[0].Text = "Totals";
                    e.Row.Cells[1].Text = stream.Files.Sum(o => o.Envelopes).ToString();
                    e.Row.Cells[2].Text = stream.Files.Sum(o => o.Sheets).ToString();
                }
            }
        }
    }

class GridDmChangeStream : ITemplate
{
    public void InstantiateIn(System.Web.UI.Control container)
    {
        DropDownList ddl = new DropDownList
        {
            ID = "ddlPrismPart",
            CssClass = "form-control",
            DataValueField = "Key",
            DataTextField = "Value",
            AutoPostBack = true
        };
        container.Controls.Add(ddl);
    }
}

Это работает нормально, но теперь янеобходимо добавить столбец флажков в вышеупомянутую динамическую сетку.

                gv.Columns.Add(new CheckBoxField() { HeaderText = "Change Stream", DataField="Selected" });

Таким образом, пользователь выберет нужные ему флажки, а затем нажмет кнопку (еще предстоит добавить - она, вероятно, будет внижний колонтитул сетки, и применяется только к флажкам, которые находятся в той же сетке).

Но как я могу установить флажки на стороне сервера, когда обратная передача происходит при новом нажатии кнопки?

Если бы это была статическая сетка, я знаю, как это сделать, но есть много динамических сеток, я не уверен, как?

Я подумал, что, возможно, я мог бы сделать событие client-onclick, это вызовынекоторые JS, чтобы перебрать сетку, buildinПередайте строку с флажками с разделителями, которые отмечены галочкой, затем вызовите __doPostbackAction вручную и перехватите вызов на стороне сервера, проанализируйте строку с разделителями и примите соответствующие меры.
Но я надеюсь, что есть лучший / более простой способ?

Заранее спасибо!

PS Я не новичок в этом, поэтому, пожалуйста, предоставьте пример и четкое объяснение, чтобы мой простой ум мог понять :) Спасибо,

...