我正在为Umbraco创建自定义数据类型。此数据类型只是从数据库中读取记录并将它们呈现在html表中,而不是中继器。在每一行中,最初有两个按钮,一个用于编辑记录,另一个用于删除记录。
单击编辑时,该行将进入编辑模式,其中使用文本框代替文字,而不是“编辑”和“删除”按钮,而是“保存”和“取消”。 单击这些按钮中的任何一个似乎都不起作用。他们应该开火的命令没有开火。
我已经读过在页面加载之前必须创建这些按钮,我这样做了。我有每种类型的列表(保存,取消)。这是在Init上生成的,ID基于记录的ID。此处也分配了命令和命令参数。
然而,这些命令似乎仍未触发。
代码
public class ProductManagerDataEditor : System.Web.UI.UpdatePanel, umbraco.interfaces.IDataEditor
{
private umbraco.interfaces.IData _data;
//Properties
private List<Record> Records { get; set; }
private int EditRecordID = 0;
//Editor Controls
TextBox tb_EditName;
TextBox tb_EditPrice;
Button btn_Add;
List<Button> EditButtons;
List<Button> DeleteButtons;
List<Button> SaveButtons;
List<Button> CancelButtons;
/// <summary>
/// Constructor.
/// Reads in curent data along with configuration settings for this data type.
/// </summary>
/// <param name="Data"></param>
/// <param name="Configuration"></param>
public ProductManagerDataEditor(umbraco.interfaces.IData Data, SortedList<String, String> Configuration)
{
_data = Data;
}
public virtual bool TreatAsRichTextEditor
{
get { return false; }
}
public bool ShowLabel
{
get { return true; }
}
public Control Editor { get { return this; } }
public void Save()
{
}
/// <summary>
/// On Init Method
/// </summary>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
/// <summary>
/// On Load Method
/// </summary>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
LoadRecords();
GenerateControls();
}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
RenderTableContents(writer);
}
/// <summary>
/// Generates the buttons to be used
/// </summary>
protected void GenerateControls()
{
SaveButtons = new List<Button>();
CancelButtons = new List<Button>();
DeleteButtons = new List<Button>();
EditButtons = new List<Button>();
//Other Buttons
foreach (Record r in Records)
{
//Save Button
Button btn_Save = new Button();
btn_Save.CssClass = "btn-save";
btn_Save.ID = "btnSave_" + r.ID;
btn_Save.Text = "Save";
btn_Save.Command += new CommandEventHandler(Save);
btn_Save.CommandArgument = r.ID.ToString();
//Cancel Edting Button
Button btn_Cancel = new Button();
btn_Cancel.CssClass = "btn-cancel";
btn_Cancel.ID = "btnCancel";
btn_Cancel.Text = "Cancel";
btn_Cancel.Click += new EventHandler(CancelEdit);
//Delete Button
Button btn_Del = new Button();
btn_Del.CssClass = "btn-delete";
btn_Del.ID = "btnDelete_" + r.ID;
btn_Del.Text = "Delete";
btn_Del.Command += new CommandEventHandler(Delete);
btn_Del.CommandArgument = r.ID.ToString();
//Edit Button
Button btn_Edit = new Button();
btn_Edit.CssClass = "btn-edit";
btn_Edit.ID = "btnEdit_" + r.ID;
btn_Edit.Text = "Edit";
btn_Edit.Command += new CommandEventHandler(EditRecord);
btn_Edit.CommandArgument = r.ID.ToString();
SaveButtons.Add(btn_Save);
CancelButtons.Add(btn_Cancel);
DeleteButtons.Add(btn_Del);
EditButtons.Add(btn_Edit);
}
}
/// <summary>
/// Loads the records from the database
/// </summary>
protected void LoadRecords()
{
Records = //Loaded from db...
}
/// <summary>
/// Renders The Table of Records
/// </summary>
protected void RenderTableContents(HtmlTextWriter w)
{
bool editMode = false;
w.Write("<table class='product-manager' cellspacing='0' cellpadding='3px'>");
w.Write("<tr class='head'>");
w.Write("<th>Name</th>");
w.Write("<th>Price</th>");
w.Write("<th></th>");
w.Write("<th></th>");
w.Write("</tr>");
int buttonIndex = 0;
foreach (Record r in Records)
{
//If editing this record, display text boxes
if (EditRecordID == r.ID)
{
editMode = true;
tb_EditName = new TextBox { Text = r.Name };
tb_EditPrice = new TextBox { Text = r.Price.ToString() };
w.Write("<tr>");
w.Write("<td>");
tb_EditName.RenderControl(w);
w.Write("</td>");
w.Write("<td>");
tb_EditPrice.RenderControl(w);
w.Write("</td>");
w.Write("<td>");
SaveButtons[buttonIndex].RenderControl(w);
w.Write("</td>");
w.Write("<td>");
CancelButtons[buttonIndex].RenderControl(w);
w.Write("</td>");
w.Write("</tr>");
}
//Not in edit mode
else
{
w.Write("<tr>");
w.Write("<td>" + t.Name + "</td>");
w.Write("<td>£" + t.Price + "</td>");
w.Write("<td>");
EditButtons[buttonIndex].RenderControl(w);
w.Write("</td>");
w.Write("<td>");
DeleteButtons[buttonIndex].RenderControl(w);
w.Write("</td>");
w.Write("</tr>");
}
buttonIndex++;
}
w.Write("</table>");
}
#region Events
/// <summary>
/// Sets the id of the row to edit
/// </summary>
protected void EditRecord(object sender, CommandEventArgs e)
{
EditRecordID = e.CommandArgument.ToString();
}
/// <summary>
/// Cancels editing mode
/// </summary>
protected void CancelEdit(object sender, EventArgs e)
{
EditRecordID = 0;
}
/// <summary>
/// Deletes Selected Record
/// </summary>
protected void DeleteRecord(object sender, CommandEventArgs e)
{
//TODO
}
/// <summary>
/// Updates Record Details
/// </summary>
protected void Save(object sender, CommandEventArgs e)
{
//Update the Record
}
#endregion
}
答案 0 :(得分:1)
我尝试了你的代码,显然有问题的代码是渲染。 UpdatePanel
根本没有将按钮视为触发器。
解决方案是在asp:Table
内将控件添加到面板中,让UpdatePanel
进行渲染,因此请跳过渲染代码。
这是您需要更改的内容(这仅适用于编辑按钮,但您可以为所有人添加代码):
protected void GenerateControls()
{
var table = new Table();
var headerRow = new TableHeaderRow();
var headerCell = new TableHeaderCell();
headerCell.Text = "Name";
headerRow.Cells.Add(headerCell);
headerCell = new TableHeaderCell();
headerCell.Text = "Price";
headerRow.Cells.Add(headerCell);
headerCell = new TableHeaderCell();
headerRow.Cells.Add(headerCell);
headerCell = new TableHeaderCell();
headerRow.Cells.Add(headerCell);
table.Rows.Add(headerRow);
//Other Buttons
foreach (Record r in Records)
{
var row = new TableRow();
var cell = new TableCell();
//Edit Button
Button btn_Edit = new Button();
btn_Edit.CssClass = "btn-edit";
btn_Edit.ID = "btnEdit_" + r.ID;
btn_Edit.Text = "Edit";
btn_Edit.Command += new CommandEventHandler(EditRecord);
btn_Edit.CommandArgument = r.ID.ToString();
cell.Controls.Add(btn_Edit);
row.Cells.Add(cell);
table.Rows.Add(row);
}
ContentTemplateContainer.Controls.Add(table);
}
顺便说一下,这看起来像一个网格。为什么不使用GridView
或ListView
?