몇 가지 유사한 질문을 보았지만 해결책 중 어느 것도 나를 위해 일하지 않았습니다. 테이블이 있고 다음과 같이 두 개의 버튼을 동적으로 추가하고 모든 버튼에 대해 하나의 공통 리스너를 원합니다.
Button b; //This is defined as a variable in class, not in a function
...
...
void someFunction( . . . )
{
foreach (DataRow row in table.Rows)
{
try
{
string starthour = row["starthour"].ToString(), endhour = row["endhour"].ToString(), day = row["day"].ToString(), building = row["building"].ToString(), room = row["room"].ToString();
int start = Convert.ToInt32(starthour.Substring(0, starthour.Length - 2));
int end = Convert.ToInt32(endhour.Substring(0, endhour.Length - 2));
int startindex = getHourIndex(start);
int endindex = getHourIndex(end);
int dayindex = getDayIndex(day);
for (int i = startindex; i < endindex; i++)
{
b = new Button();
b.Text = subj + numb + " " + section;
Color clr = getCourseColor(subj + numb + section, courses);
b.BackColor = clr;
b.Enabled = true;
b.Click += new EventHandler(button_Click);
table_filter_instructor_schedule.Rows[i].Cells[dayindex].Controls.Add(b);
}
}
catch (Exception)
{
}
}
}
다음은 이벤트 핸들러입니다.
protected void button_Click(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
그러나 문제는 ebent 핸들러 함수가 호출되지 않는다는 것입니다. 누구든지 이것으로 나를 도울 수 있습니까 *
감사
편집 : 다음은 페이지 모양이며 해당 버튼에 대한 리스너를 추가하고 싶습니다.
동적 컨트롤이 작동하고 이벤트도 발생 시키려면 페이지 수명주기의 초기에 다시 만들어야합니다 (Page_Init, Page_Load 이상). 컨트롤을 다시 만들고 이벤트 처리기를 연결할 때 동일한 ID를 할당하는 것이 중요합니다.
동적으로 생성 된 컨트롤을 사용하면 일반적으로 많은 복잡성이 추가되며 더 간단한 방법이 없는지 확인해야합니다. 함수에서 버튼은 데이터 테이블을 기반으로 생성됩니다. 따라서 동적으로 생성 된 버튼 대신 반복기를 사용하는 것이 좋은 방법 일 수 있습니다. 이를 통해 이벤트를 정적으로 연결할 수 있습니다.
컨트롤을 동적으로 만드는 방법에 대한 자세한 샘플은이 링크를 참조하십시오 . 그러나 가능한 경우 정적 접근 방식을 선호하는 것도 제안합니다.
기존 컨트롤은 종종 컨트롤을 동적으로 생성하여 얻을 수있는 기능을 제공 할 수 있습니다. 예를 들어, Repeater, DataList 및 RadioButtonList 컨트롤과 같은 컨트롤은 페이지가 실행될 때 동적으로 행 또는 기타 컨트롤 요소를 만들 수 있습니다.
귀하의 특정 경우 (이미지를 기반으로) 다음과 같은 정적 접근 방식을 제안합니다.
다음 샘플은 주요 부분을 보여줍니다 (3 일 동안 열만 추가했습니다).
이 반복기는 매우 기본적인 HTML 테이블을 만듭니다. 테이블 행의 버튼과 이벤트 핸들러의 정적 등록에 유의하십시오.
<asp:Repeater ID="rptTimeTable" runat="server" OnItemDataBound="rptTimeTable_ItemDataBound">
<HeaderTemplate>
<table>
<thead>
<tr>
<td>Time</td>
<td>Mon</td>
<td>Tue</td>
<td>Wed</td>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("Time", "{0:t}") %></td>
<td>
<asp:Button ID="btnMon" runat="server" OnClick="btn_ClickHandler" />
</td>
<td>
<asp:Button ID="btnTue" runat="server" OnClick="btn_ClickHandler" />
</td>
<td>
<asp:Button ID="btnWed" runat="server" OnClick="btn_ClickHandler" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
데이터 클래스는 나중에 버튼에 넣는 각 버튼에 대한 텍스트를 저장합니다.
public class RepeaterData
{
public DateTime Time { get; set; }
public string MonText { get; set; }
public string TueText { get; set; }
public string WedText { get; set; }
}
나는 이것을 Page_Load에 넣었지만 (PostBack이 아닌 경우에만) 원할 때마다 실행할 수 있습니다.
var data = new List<RepeaterData>();
data.Add(new RepeaterData() { Time = DateTime.Today.AddHours(9), MonText = "123", TueText = null, WedText = null });
data.Add(new RepeaterData() { Time = DateTime.Today.AddHours(10), MonText = null, TueText = "456", WedText = "789" });
data.Add(new RepeaterData() { Time = DateTime.Today.AddHours(11), MonText = null, TueText = null, WedText = null });
data.Add(new RepeaterData() { Time = DateTime.Today.AddHours(12), MonText = "123", TueText = null, WedText = null });
rptTimeTable.DataSource = data;
rptTimeTable.DataBind();
protected void rptTimeTable_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
var data = (RepeaterData)e.Item.DataItem;
SetButtonText(e.Item, "btnMon", data.MonText);
SetButtonText(e.Item, "btnTue", data.TueText);
SetButtonText(e.Item, "btnWed", data.WedText);
}
}
private void SetButtonText(RepeaterItem repeaterItem, string btnId, string btnText)
{
var btn = repeaterItem.FindControl(btnId) as Button;
if (btn != null)
{
if (!string.IsNullOrEmpty(btnText))
btn.Text = btnText;
else
btn.Visible = false;
}
}
protected void btn_ClickHandler(object sender, EventArgs e)
{
// Do whatever you like
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다