gv.DataBinding 이벤트에서 동적으로 일부 필드를 gridview에 추가하고 있습니다. C#에서 선택, 페이징 및 정렬을 처리하고 있습니다. 모든 것이 화면에 제대로 렌더링되고 데이터가 gridview에 로드되는 것을 볼 수 있습니다.
<asp:GridView ID="gvPulledBills" runat="server" AutoGenerateColumns="false"
OnDataBinding="gvPulledBills_DataBinding" OnRowDataBound="gvPulledBills_RowDataBound"
OnSelectedIndexChanged="gvPulledBills_SelectedIndexChanged"
AllowSorting="true" OnSorting="gvPulledBills_Sorting"
AllowPaging="true" PageSize="30" OnPageIndexChanging="gvPulledBills_PageIndexChanging"
DataKeyNames="Id" SkinID="gridviewGray">
gv.SelectedIndexChanged 이벤트에서 선택한 행의 ID를 검색해야 합니다. Id는 HiddenField에 저장되고 gv.DataKeyNames 값은 ID로 설정되므로 두 가지 방법으로 검색할 수 있습니다.
gv.SelectedValue는 초기 렌더링 후에 제대로 작동합니다. 그러나 페이징/정렬 후 행을 선택할 때 gv.SelectedValue는 null을 반환합니다. 선택한 행 마크업이 올바르게 작동하더라도 아무 것도 선택되지 않은 것처럼 작동합니다. 열을 동적으로 바인딩할 때 데이터 키를 검색할 수 있도록 하기 위해 수행해야 하는 작업에 대한 제안 사항이 있습니까?
또는 gv.SelectedValue에 의존하지 않고 숨겨진 필드에 직접 액세스하려고 시도했습니다...
protected void gvPulledBills_SelectedIndexChanged(object sender, EventArgs e)
{
GridView gv = (GridView)sender;
//var key = (int)gv.SelectedValue;
var index = gv.SelectedIndex - (gv.PageIndex * gv.PageSize);
var row = gv.Rows[index];
var hiddenField = (HiddenField)row.FindControl("hdnId");
var key = int.Parse(hiddenField.Value);
...
}
그러나 컨트롤 컬렉션은 화면에 데이터가 있더라도 명시적으로 선언된 필드의 경우에도 모든 셀에서 비어 있습니다. 명시적 선언
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:HiddenField ID="hdnId" runat="server" Value='<%# Eval("Id") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
동적 선언
private TemplateField CreateTemplateField()
{
var controls = new List<Control>
{
{ CreateHiddenIdField() }
};
var tf = GridViewTools.CreateTemplateField(string.Empty, string.Empty, controls);
tf.ItemStyle.CssClass = "noRightBorder";
tf.HeaderStyle.CssClass = "noBorder";
return tf;
}
private static Control CreateHiddenIdField()
{
var hdn = new HiddenField();
hdn.ID = "hdnId";
hdn.Value = "'<%# Eval(\"Id\") %>'";
return hdn;
}
//in static class GridViewTools
public static TemplateField CreateTemplateField(string headerText, string sortExpression, List<Control> controls)
{
TemplateField tf = new TemplateField();
tf.HeaderText = headerText;
tf.SortExpression = sortExpression;
tf.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, controls);
return tf;
}
//... snippet that adds column to grid
var addColumns = new List<DataControlField>();
addColumns.Add(CreateTemplateField());
// add other columns
foreach (var column in addColumns)
{
gv.Columns.Add(column);
}
//...
동적 열이 있는 페이징/정렬 뒤의 코드를 사용할 때 SelectedValue를 채우는 방법에 대한 제안이 있는 사람이 있습니까? 또는 동적으로 생성된 필드 컨트롤이 코드 숨김에서 채워지고 액세스 가능하도록 하는 방법에 대한 제안 사항이 있습니까?
더 많은 열이 추가되었으며 대부분 바인딩된 필드가 있습니다. 페이지의 다른 위치에 있는 드롭다운 필드를 기반으로 열 집합을 사용자 지정하기 위해 이 작업을 수행하고 있습니다. 총 열이 약 30개이며 모든 열에 대한 가시성을 설정하는 것보다 gridview에 모두 추가하지 않는 것이 좋습니다.
업데이트 솔루션 이에 대한 최종 솔루션은 다음과 같습니다.
var gv = (GridView)sender;
var rowIndex = gv.SelectedIndex - (gv.PageIndex * gv.PageSize);
var key = (int)gv.DataKeys[rowIndex]["Id"];
DisplayWorkDetail(key);
SelectedRow
그리고 SelectedValue
이 시점에서 null입니다. 만 SelectedIndex
채워집니다. SelectedIndex
RowIndex 로 변환 하여 행에서 직접 DataKey를 검색할 수 있었습니다.
다른 GridView와 함께 사용할 메서드로 쉽게 추출할 수 있도록 보낸 사람을 사용하여 코드를 일반화하기로 했습니다.
나는 당신이 여기에서 sender를 사용할 수 없다고 생각합니다.
그러나 Rowcommand는 선택한 인덱스를 변경하지 않았지만 해당 인덱스 변경 이벤트에서는 변경되었습니다. 따라서 컨트롤을 직접 사용/참조할 수 있습니다.
예:
GridViewRow myGv As GridViewRow = gvPulledBills.SelectedRow
그런 다음: myGv.RowIndex(행 인덱스 가져오기/사용).
그러나 이미 행이 있으므로 다음을 수행합니다.
hiddenField myField = (HiddenField)myGv.FindControl("hdnId");
int MyKey = int.Parse(myField.Value);
Datakeys 컬렉션을 사용하고 숨겨진 필드가 없다고 가정할 수도 있습니다.
따라서 다음과 같이 할 수 있습니다.
GridViewRow myGv As GridViewRow = gvPulledBills.SelectedRow
int RowPK = (int)(gvPulledBills.DataKeys[myGv.RowIndex]["ID"]);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다