2015-01-27 4 views
0

OnRowDataBound를 사용하여 다음과 같은 그리드보기에 링크 단추를 자동으로 추가하고 있습니다. 내가 겪고있는 문제는 명령 인수를 설정하는 것이다.asp.net set 명령 인수

<asp:LinkButton ID = "lnkDelete" Text = "Delete" CommandArgument = '<%# Eval("Value") %>' runat = "server" OnClick = "DeleteFile" /> 

다음은 링크를 추가하는 코드입니다. 명령 인수를 Eval ("Value")로 설정했지만 작동하지 않습니다. Here is a link to the original code that I'm trying to change so it is dynamic.

protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     LinkButton lnkView = new LinkButton(); 
     lnkView.ID = "lnkDelete"; 
     lnkView.Text = "Delete"; 
     lnkView.Click += DeleteFile; 
     lnkView.CommandArgument = Eval("Value"); 
     e.Row.Cells[1].Controls.Add(lnkView); 
    } 

답변

1

RowDataBound은 모든 연속 포스트 백에 다시 생성 할 필요가 있기 때문에 동적으로 컨트롤을 추가 할 수있는 권한 이벤트가 아닙니다. RowDataBoundGridView.DataBind()으로 전화 한 경우에만 실행됩니다.

그래서 대신 RowCreated를 사용하지만, RowDataBoundCommandArgument 값을 할당하고 e.Row.DataItem에서 얻을 Eval("Value")하지만 실제 데이터 소스를 사용하지 않습니다. 이 같은

뭔가 작업을해야합니다 :

protected void OnRowCreated(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     LinkButton lnkView = new LinkButton(); 
     lnkView.ID = "lnkDelete"; 
     lnkView.Text = "Delete"; 
     lnkView.Click += DeleteFile; 
     e.Row.Cells[1].Controls.Add(lnkView); 
    } 
} 

protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     LinkButton lnkView = (LinkButton)e.Row.FindControl("lnkDelete"); 
     var rowView = (DataRowView)e.Row.DataItem; 
     lnkView.CommandArgument = rowView.Row.Field<string>("Value"); 
    } 
} 

을이 당신이 디버거에서 얻을 수있는 실제 데이터 소스에 (DataRowView)e.Row.DataItem을 변경할 필요가 런타임에 예외가 발생합니다.

편집 : 그것은 ListItem입니다 주석과 당신이 Value 숙박 시설의 사용을 원하는 : 나는 데이터 바인딩을 사용하고

var item = (ListItem) e.Row.DataItem; 
lnkView.CommandArgument = item.Value; 
+0

. 링크가 만들어지고있는 것은 그들이 작동하지 않는다는 것입니다. 나는 초보자 일 뿐이고, 나는 당신의 모범에서 무엇을해야 하는지를 아직도 이해하지 못합니다. – Laserchalk

+0

나는 그것을 조금 더 잘 이해한다고 생각한다. 그래서이 부분 (DataRowView) e.Row.DataItem; "DataRowView"가 내 데이터 소스 일 필요가 있습니까? – Laserchalk

+0

@Laserchalk : 예, 데이터 소스의 단일 레코드입니다. 'DataTow'를'DataSource'로 사용하면'DataRowView'입니다. 다른 소스를 사용하는 경우 유형을 변경해야합니다. 그러나 당신은 무엇을 이해하지 못했습니까? OnRowCreated 이벤트 핸들러를 등록하고 거기에 링크를 만들었습니까? 어떻게 된 거예요? –