사실, 저는 asp.net 및 C#을 사용하여 동적 템플릿을 개발하고 있습니다.
나는 하나의 메인 aspx 페이지를 가지고 있으며이 페이지 안에 usercontrol 페이지가있다. 내 usercontrol 내에서 나는 XML 파일에서 데이터를 가져 와서 동적으로 listview 내부 테이블을 만들 수 있습니다. 각 행에는 아래 그림에서 볼 수 있듯이 마지막 열의 편집 및 삭제 버튼이 포함되어 있습니다.동적 버튼 명령 이벤트가 실행되지 않습니다.
난 당신이 아래 볼 수 있듯이 ItemDataBound
함수 내에서 테이블을 만들 수 있습니다
protected void lv_Uc_Module_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem && hid_SaveClicked.Value != "1")
{
XmlDocument xDocRead = new XmlDocument();
xDocRead.Load(Server.MapPath("ModuleTemp.xml"));
string xModuleName = hid_ChooseModule.Value;
XmlNode xColCounter;
TableRow tr_DataBound = new TableRow();
TableRow tr_Lv_Header = new TableRow();
if (!"".Equals(hid_ChooseModule.Value))
{
xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List");
}
else
{
xModuleName = xDocRead.SelectSingleNode("ModuleTemp").FirstChild.Name;
xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List");
}
int pkCounter = 0, nonPkCounter = 0, colCount = xColCounter.ChildNodes.Count;
string[] primaryKey = new string[30];
string[] nonPrimaryKey = new string[colCount + 1];
for (int i = 1; i <= colCount; i++)
{
if (xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Edit/TableColumn" + i).Attributes.GetNamedItem("IsPrimaryKey").Value == "Y")
{
primaryKey[pkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Edit/TableColumn" + i).Attributes.GetNamedItem("Name").Value;
pkCounter++;
}
else
{
nonPrimaryKey[nonPkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Edit/TableColumn" + i).Attributes.GetNamedItem("Name").Value;
nonPkCounter++;
}
}
System.Data.DataRowView rowView = e.Item.DataItem as System.Data.DataRowView;
for (int i = 0; i < pkCounter + nonPkCounter; i++)
{
dataBoundTemp[rowCounter, i] = rowView[i].ToString();
}
rowCounter++;
TableCell tc_Lv_Header = new TableCell();
if (!"".Equals(hid_ChooseModule.Value))
{
if (tempHeader == 0)
{
tempHeader++;
for (int i = 1; i <= pkCounter + nonPkCounter; i++)
{
tc_Lv_Header = new TableCell();
Label lb = new Label();
if (i <= pkCounter)
{
lb.Text = primaryKey[i - 1];
}
else
{
lb.Text = nonPrimaryKey[i - pkCounter - 1];
}
lb.ID = "lb" + i + "_Table_IphContainer";
tc_Lv_Header.Controls.Add(lb);
tc_Lv_Header.CssClass = "th_ItemTemplate";
tr_Lv_Header.Cells.Add(tc_Lv_Header);
}
tr_Lv_Header.Cells.Add(tc_Lv_Header);
table_Header.Rows.Add(tr_Lv_Header);
PlaceHolder th_Ph_Lv_Hedear = (PlaceHolder)lv_Uc_Module.FindControl("th_Ph_Lv_header");
th_Ph_Lv_Hedear.Controls.Add(table_Header);
}
}
TableCell tc_DataBound = new TableCell();
if (editTempSelection == e.Item.DataItemIndex)
{
for (int i = 1; i <= pkCounter + nonPkCounter; i++)
{
//tc_DataBound = new TableCell();
tc_DataBound = new TableCell();
TextBox tb = new TextBox();
//(TextBox)e.Item.FindControl("td_EditTemp" + i);
tb.Width = 110;
tb.Text = rowView[i - 1].ToString();
tb.ID = "td_EditTemp" + i + "_" + e.Item.DataItemIndex;
tc_DataBound.Controls.Add(tb);
tc_DataBound.CssClass = "td_Tb_ItemTemplate";
tr_DataBound.Cells.Add(tc_DataBound);
}
}
else
{
for (int i = 1; i <= pkCounter + nonPkCounter; i++)
{
tc_DataBound = new TableCell();
Label lb = new Label();
//(Label)e.Item.FindControl("lb_ItemTemp" + i);
lb.Text = rowView[i - 1].ToString();
lb.ID = "lb_ItemTemp" + i + "_" + e.Item.DataItemIndex;
tc_DataBound.Controls.Add(lb);
tc_DataBound.CssClass = "td_Lb_ItemTemplate";
tr_DataBound.Cells.Add(tc_DataBound);
}
}
// add button to the columns
if (editTempSelection != e.Item.DataItemIndex)
{
tc_DataBound = new TableCell();
Button btn_Edit = new Button();
btn_Edit.ID = "btn_Edit";
btn_Edit.CommandName = "Edit";
btn_Edit.CssClass = "btn_Edit";
//btn_Edit.CausesValidation = true;
tc_DataBound.Controls.Add(btn_Edit);
tr_DataBound.Cells.Add(tc_DataBound);
tc_DataBound = new TableCell();
Button btn_Delete = new Button();
btn_Delete.ID = "btn_Delete";
btn_Delete.CommandName = "Delete";
btn_Delete.CssClass = "btn_Delete";
btn_Delete.CausesValidation = false;
btn_Delete.OnClientClick = "return confirm('Are you sure you want to delete this item?');";
//btn_Delete.Command += new CommandEventHandler(lv_Uc_Module_ItemDeleting);
//btn_Delete.CommandName = e.Item.DataItemIndex.ToString();
tc_DataBound.Controls.Add(btn_Delete);
tr_DataBound.Cells.Add(tc_DataBound);
}
else
{
tc_DataBound = new TableCell();
Button btn_Update = new Button();
btn_Update.ID = "btn_Update";
//btn_Update.CommandName = "Update";
btn_Update.CssClass = "btn_Update";
//btn_Update.ValidationGroup = "VGEditTmp";
//btn_Update.OnClientClick = "alert('hi');";
btn_Update.Command += new CommandEventHandler(lv_Uc_Module_ItemUpdating);
btn_Update.CommandName = e.Item.DataItemIndex.ToString();
tc_DataBound.Controls.Add(btn_Update);
tr_DataBound.Cells.Add(tc_DataBound);
hid_SaveClicked.Value = "1";
tc_DataBound = new TableCell();
Button btn_Cancel = new Button();
btn_Cancel.ID = "btn_Cancel";
btn_Cancel.CommandName = "Cancel";
btn_Cancel.CssClass = "btn_Cancel";
btn_Cancel.CausesValidation = false;
tc_DataBound.Controls.Add(btn_Cancel);
tr_DataBound.Cells.Add(tc_DataBound);
tr_DataBound.CssClass = "tr_Edit_ItemTemplate";
}
// add columns to the row
tr_DataBound.Cells.Add(tc_DataBound);
table_Lv_ItemTemplate = (Table)e.Item.FindControl("Table_Lv_ItemTemplate");
table_Lv_ItemTemplate.Rows.Add(tr_DataBound);
//"lb_ItemTemp" + i + "_" + e.Item.DataItemIndex; "lb_ItemTemp" + rowCounter + "_" + e.Item.DataItemIndex
}
}
텍스트 상자, 당신은 아래 그림에서 볼 수 있습니다 내가
내 목록보기 코드 아래 S : 저장 버튼을 사용자가 클릭이는 ItemUpdating
기능을 실행하지 데이터베이스에 편집 된 항목의 변경 사항을 저장하면
<asp:ListView ID="lv_Uc_Module" runat="server"
OnItemEditing="lv_Uc_Module_ItemEditing"
OnItemDeleting="lv_Uc_Module_ItemDeleting"
OnItemCanceling="lv_Uc_Module_ItemCanceling"
OnItemDataBound="lv_Uc_Module_ItemDataBound"
OnSorting="lv_Uc_Module_Sorting">
<LayoutTemplate>
<asp:Table runat="server" ID="table_Lv_Layout">
<asp:TableRow runat="server" ID="tr_Table_Layout">
<asp:TableCell runat="server" ID="td_Table_Layout">
<asp:Table runat="server" ID="itemPlaceholderContainer">
<asp:TableRow runat="server" ID="tr_Table_IphContainer">
<asp:TableHeaderCell runat="server">
<asp:PlaceHolder ID="th_Ph_Lv_header" runat="server"></asp:PlaceHolder>
</asp:TableHeaderCell>
</asp:TableRow>
<asp:TableRow runat="server">
<asp:TableCell runat="server">
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</asp:TableCell>
</asp:TableRow>
<asp:TableRow runat="server" ID="tr_Validate_Table_Layout">
<asp:TableCell runat="server" ID="td_Validate_Table_Layout" HorizontalAlign="Center" BackColor="#CCCCCC">
<asp:ValidationSummary ID="ValidationSummary1" runat="server" HeaderText="You received the following errors:" ShowMessageBox="true" ShowSummary="false" ValidationGroup="VGEditTmp" />
<%--<asp:ValidationSummary ID="ValidationSummary2" runat="server" HeaderText="You received the following errors:" ShowMessageBox="true" ShowSummary="false" ValidationGroup="VGInsertTmp" />--%>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
<br />
<asp:DataPager ID="lv_DataPager" runat="server" PagedControlID="lv_Uc_Module" PageSize="25" OnPreRender="lv_DataPager_PreRender">
<Fields>
<asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowLastPageButton="true" FirstPageImageUrl="~/Images/First.png" LastPageImageUrl="~/Images/Last.png" NextPageImageUrl="~/Images/Next.png" PreviousPageImageUrl="~/Images/Previous.png" />
<asp:TemplatePagerField>
<PagerTemplate>
<span style="color:Blue;">
</span>
</PagerTemplate>
</asp:TemplatePagerField>
</Fields>
</asp:DataPager>
</LayoutTemplate>
<ItemTemplate>
<asp:TableRow runat="server">
<asp:TableCell runat="server">
<asp:Table runat="server" ID="Table_Lv_ItemTemplate"></asp:Table>
</asp:TableCell>
<asp:TableCell runat="server">
<asp:Button ID="btn_Edit" runat="server" CommandName="Edit" Text="" CssClass="btn_Edit" CausesValidation="True" Visible="false" />
<asp:Button ID="btn_Delete" runat="server" CommandName="Delete" Text="" CssClass="btn_Delete" CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this item?');" Visible="false" />
</asp:TableCell>
</asp:TableRow>
</ItemTemplate>
문제입니다. 아래 코드를 ItemDataBound
함수에 넣고 ItemUpdating
함수를 호출합니다.
btn_Update.Command += new CommandEventHandler(lv_Uc_Module_ItemUpdating);
btn_Update.CommandName = e.Item.DataItemIndex.ToString();
어떻게 끝내야하는 저를 인도 해주십시오. 귀하의 검토에 감사드립니다.
감사
도 확인하십시오. 문제는 사용자가 저장 단추를 클릭하면 lv_Uc_Module_ItemUpdating 함수를 실행하려고하는 것입니다. Postback 또는 dataBind 전에 텍스트 상자의 값을 가져 와서 저장하십시오. 하지만 지금 사용자가 저장 버튼을 클릭하면 텍스트 상자에 더 이상 값을 가져 와서 데이터베이스에 저장할 수 없습니다. –일반적으로 사용자가 저장 버튼을 클릭하면 Page_Init 등으로 시작하는 서버에서 페이지 수명주기가되는 포스트 백이 수행됩니다. 위의 링크 참조. 이 라이프 사이클 동안에 만 이벤트 코드가 실행됩니다. – Elementenfresser