Добрый день. У меня стала задача - создать кастом контрол с возможностью генерировать разное кол-во гридвьювов. На вход которого я буду передовать Dictionary<string, HostLog[]>, где HostLog - массив некоторого класса, по которому будет идти биндинг каждой из гридвью Вот код моего DataControlField (в нем я тоже пытался отловить нажатие по linkButton: ф-ция linkButton_Click) Код | public class LinkTemplateField : DataControlField { public const string CommandName = "Redirect"; public string LinkText { get { object value = base.ViewState["LinkText"]; if (value != null) { return value.ToString(); } else { return ""; } } set { base.ViewState["LinkText"] = value; this.OnFieldChanged(); } }
public string LinkCommandArgument { get { object value = base.ViewState["LinkCommandArgument"]; if (value != null) { return value.ToString(); } else { return ""; } } set { base.ViewState["LinkCommandArgument"] = value; this.OnFieldChanged(); } }
protected override DataControlField CreateField() { return new BoundField(); }
public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) {
//Call the base method. base.InitializeCell(cell, cellType, rowState, rowIndex);
switch (cellType) { case DataControlCellType.DataCell: this.InitializeDataCell(cell, rowState); break;
/*case DataControlCellType.Footer: this.InitializeFooterCell(cell, rowState); break;*/
case DataControlCellType.Header: this.InitializeHeaderCell(cell, rowState); break; } }
protected void InitializeDataCell(DataControlFieldCell cell, DataControlRowState rowState) { string ID = Guid.NewGuid().ToString(); LinkButton linkButton = new LinkButton(); linkButton.ID = ID; linkButton.Click += new EventHandler(linkButton_Click);
linkButton.DataBinding += new EventHandler(linkButton_DataBinding); cell.Controls.Add(linkButton); }
void linkButton_Click(object sender, EventArgs e) {
object sender1 = sender; //throw new Exception("The method or operation is not implemented."); }
protected void InitializeHeaderCell(DataControlFieldCell cell, DataControlRowState rowState) { Label lbl = new Label(); lbl.Text = "<b>File Name</b>"; cell.Controls.Add(lbl); }
protected void linkButton_DataBinding(object sender, EventArgs e) { // get a reference to the control that raised the event LinkButton linkButton = (LinkButton)sender; Control container = (GridViewRow)linkButton.NamingContainer; linkButton.Click += new EventHandler(linkButton_Click); // get a reference to the row object object dataItem = DataBinder.GetDataItem(container);
// get the row's value for the named data field only use Eval when it is neccessary // to access child object values, otherwise use GetPropertyValue. GetPropertyValue // is faster because it does not use reflection object dataFieldValueLinkText = null; object dataFieldValueLinkCommandArgument = null; dataFieldValueLinkText = this.LinkText.Contains(".") ? DataBinder.Eval(dataItem, this.LinkText) : DataBinder.GetPropertyValue(dataItem, this.LinkText); dataFieldValueLinkCommandArgument = this.LinkText.Contains(".") ? DataBinder.Eval(dataItem, this.LinkCommandArgument) : DataBinder.GetPropertyValue(dataItem, this.LinkCommandArgument);
linkButton.CommandName = CommandName; if (dataFieldValueLinkText != null) { linkButton.Text = dataFieldValueLinkText.ToString(); }
if (dataFieldValueLinkCommandArgument != null) { linkButton.CommandArgument = dataFieldValueLinkCommandArgument.ToString(); } } }
|
Вот код моего кастом контролла Код | public class SystemLogsControl : WebControl { private static readonly ILog log = LogManager.GetLogger(typeof(AdvancedGridView).Name); //obtaining logger
public Dictionary<string, HostLog[]> LogsFromAgentHostMachines { get { return ViewState["LogsFromAgentHostMachines"] as Dictionary<string, HostLog[]>; } set { ViewState["LogsFromAgentHostMachines"] = value; } }
public HttpResponse Response;
public string LinkText { get { object o = ViewState["LinkText"]; return ((o == null) ? string.Empty : (string)o); } set { ViewState["LinkText"] = value; } }
public string LinkCommandArgument { get { object o = ViewState["LinkCommandArgument"]; return ((o == null) ? string.Empty : (string)o); } set { ViewState["LinkCommandArgument"] = value; } }
private void CreateAdvancedGridViews(Dictionary<string, HostLog[]> agentHostLogs) { if (agentHostLogs != null && agentHostLogs.Count > 0) { Table table; TableRow tableRow; TableCell tableCell; LinkTemplateField linkTemplateField; BoundField boundField; GridView advancedGridView; Controls.Clear(); LinkText = HostLog.bindingField_FileName; LinkCommandArgument = HostLog.bindingField_FileName;
foreach (KeyValuePair<string, HostLog[]> log in agentHostLogs) { table = new Table(); table.CellSpacing = 2; table.CellPadding = 2; table.BorderWidth = new Unit("0"); table.Width = new Unit("100%"); tableRow = new TableRow(); tableCell = new TableCell(); tableCell.Height = new Unit("25px"); tableCell.CssClass = "headerBg2"; tableCell.ColumnSpan = 2; tableCell.Text = string.Format("<b>Agent Host ({0}) Log Files</b>", log.Key); tableRow.Cells.Add(tableCell); table.Rows.Add(tableRow);
tableRow = new TableRow(); tableCell = new TableCell(); tableRow.VerticalAlign = VerticalAlign.Top; tableCell.Width = new Unit("100%");
advancedGridView = new GridView(); advancedGridView.ID = log.Key; advancedGridView.AutoGenerateColumns = false; advancedGridView.SkinID = "AdvancedDataGrid"; advancedGridView.Width = new Unit("95%"); advancedGridView.Init += new EventHandler(advancedGridView_Init); advancedGridView.Load += new EventHandler(advancedGridView_Load); advancedGridView.RowCommand += new GridViewCommandEventHandler(advancedGridView_RowCommand); advancedGridView.HeaderStyle.CssClass = "gridHeader"; advancedGridView.CssClass = "grid"; advancedGridView.HeaderStyle.HorizontalAlign = HorizontalAlign.Left; advancedGridView.HeaderStyle.Height = new Unit("18px"); advancedGridView.RowStyle.Height = new Unit("18px"); linkTemplateField = new LinkTemplateField(); linkTemplateField.LinkText = LinkText; linkTemplateField.LinkCommandArgument = LinkCommandArgument;
advancedGridView.Columns.Add(linkTemplateField); boundField = new BoundField(); boundField.DataField = HostLog.bindingField_LastModified; boundField.HeaderText = "<b>Last Modified</b>"; boundField.HtmlEncode = false; advancedGridView.Columns.Add(boundField);
tableCell.Controls.Add(advancedGridView); tableRow.Cells.Add(tableCell); table.Rows.Add(tableRow);
Controls.Add(table);
advancedGridView.DataSource = log.Value; advancedGridView.DataBind(); } } }
void advancedGridView_Init(object sender, EventArgs e) { //этот эвен возникает //throw new Exception("The method or operation is not implemented."); }
void advancedGridView_RowCommand(object sender, GridViewCommandEventArgs e) { //этот эвен НЕ возникает //throw new Exception("The method or operation is not implemented."); }
void advancedGridView_Load(object sender, EventArgs e) { //этот эвен возникает //throw new Exception("The method or operation is not implemented."); }
|
|