프로그래밍 방식으로 GridView에 버튼을 추가하고 특정 코드-비만 함수에 할당하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2418379

문제

런타임에 데이터 가능성을 만들고 중첩 된 for 루프를 사용하여 테이블을 채 웁니다. 이 표는 나중에 데이터 소스로 GridView에 데이터 소스로 할당하고 RowDatabound에서는 각 셀의 값을 할당합니다. 각 셀에 버튼을 제공하고 해당 버튼을 CodeBehind 함수에 할당하는 방법을 알고 싶습니다. 나는 12 개의 버튼이 있고 각 버튼에는 다른 값이 포함됩니다. 그들이 셀-특이 적 값을 저장하는 어떤 종류의 이벤트로 동일한 기능을 호출하는 경우 선호합니다.

테이블이 생성되는 코드입니다.

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)
{


    DataTable diceTable = _gm.GetDice(_gameId);
    for (int i = 0; i < GameRules.ColumnsOfDice; i++)
    {
        if(e.Row.RowIndex > -1)
        {
            /*This is where I'd like to add the button*/
            //e.Row.Cells[i].Controls.Add(new Button);
            //e.Row.Cells[i].Controls[0].Text = specific value from below

            //This is where the specific value gets input
            e.Row.Cells[i].Text = diceTable.Rows[e.Row.RowIndex][i].ToString();
        }

    }
}

다음과 같이 버튼 클릭을 처리하고 싶습니다.

protected void DiceButton_Click(int column, int row, int value)
{
    //Do whatever
}

제안이 있습니까?

도움이 되었습니까?

해결책

Markup의 GridView에서 버튼 내부에 원하는 내용 (여기서는 현재 GridViewrow의 인덱스를 선택 함)에 CommandArgument 속성을 할당하십시오.

 <asp:Button ID="lbnView" runat="server" Text="Button" OnClick="btn_Clicked" 
CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"></asp:Button>

또는 뒤에 코드에서 아래와 같은 버튼을 만들 수 있습니다.

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 


    DataTable diceTable = _gm.GetDice(_gameId); 
    for (int i = 0; i < GameRules.ColumnsOfDice; i++) 
    { 
        if(e.Row.RowIndex > -1) 
        { 
            Button btn = new Button();
            btn.CommandArgument = diceTable.Rows[e.Row.RowIndex][i].ToString(); 
            btn.Attributes.Add("OnClick", "btn_Clicked");

            e.Row.Cells[i].Controls.Add(btn);
        }
    }
}

그런 다음 아래와 같은 이벤트 핸들러를 만드십시오

protected void btn_Clicked(object sender, EventAgrs e)
{
   //get your command argument from the button here
   if (sender is Button)
   {
     try
     {
        String yourAssignedValue = ((Button)sender).CommandArgument;
     }
     catch
     {
       //Check for exception
     }
   }
}

다른 팁

불행히도 그 단계에서 새 버튼을 만들고 이벤트를 할당 할 수 없습니다. 페이지 수명주기 의이 시점까지, 이벤트가 발사 될 때, 그것은 이미 페이지를 다시로드 할 때를 추적 할 수있는 "알려진"컨트롤 목록을 이미 구축 했으므로 버튼 클릭 이벤트 코드를 발사하는 것이 알 수 없습니다. 다음에 다시 게시 할 때.

ASP.NET이 이벤트 메소드를 올바르게 발사하려면 페이지의로드 이벤트 전에 페이지의 제어 계층에 버튼 컨트롤을 추가해야합니다. 나는 보통 Init Event 또는 CreateChildControls 메소드에서 수행합니다.

문제를 해결하려면 템플릿 마크 업의 모든 셀에 버튼을 추가하고 이벤트 핸들러를 참조하는 것이 좋습니다. 그런 다음 RowDatabound 메소드를 처리하여 버튼의 가시성을 켜거나 끄십시오.

이 작업을 수행하는 가장 쉬운 방법은 GridView에 열을 추가하는 것입니다 (원하는 경우 하이퍼 링크 대신 버튼을 사용할 수 있음).

<Columns>
 <asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field={0}" HeaderText="Select" Text="Select" />

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top