Я искал ответы на мою проблему, но ничего не нашел, поэтому мне нужна ваша помощь, пожалуйста!
У меня есть страница, которая может иметь 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 Я не новичок в этом, поэтому, пожалуйста, предоставьте пример и четкое объяснение, чтобы мой простой ум мог понять :) Спасибо,