C#에서 DotNetNuke 용 위젯을 쓰려고합니다. 이것은 C#의 첫 번째 주요 프로젝트입니다. 그러나 저는 생각하기는하지만, 여전히 WebForms를 다루는 몇 가지 문제에 직면하고 있습니다. 좀 더 구체적으로 말하자면, 저는 GridView에 문제가 있습니다. 저는 90 %의 기분이지만 마지막 10 %는 살인자입니다.C# DotNetNuke 모듈 : GridView에 대한 CodeBehind에서 데이터에 액세스
첫째, 내의 .ascx 파일에서 관련 비트 : 이제
<asp:ObjectDataSource ID="objDataSource" runat="server" TypeName="MyCompany.Modules.Discovery.DiscoveryController" SelectMethod="GetDiscoverys" UpdateMethod="UpdateDiscovery" DeleteMethod="DeleteDiscovery">
<SelectParameters>
<asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
</SelectParameters>
<UpdateParameters>
<asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
</UpdateParameters>
<DeleteParameters>
<asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
</DeleteParameters>
</asp:ObjectDataSource>
<!-- Unrelated code... -->
<asp:GridView ID="grdDiscoverys" runat="server" DataSourceID="objDataSource" EnableModelValidation="True" AutoGenerateColumns="false" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" DataKeyNames="ItemId">
<Columns>
<asp:BoundField DataField="ItemId" HeaderText="#" ReadOnly="true" />
<asp:BoundField DataField="Title" HeaderText="Title" />
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<%# Eval("Image") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlEditImage" runat="server" title="Image" OnDataBinding="cmdPopulateImages_prebind" OnLoad="cmdPopulateImages_load" DataValueField="Key" DataTextField="Value" SelectedValue='<%# Bind("Image")%>' />
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Link" HeaderText="Link" />
</Columns>
</asp:GridView>
, 내 코드 숨김 파일에서 몇 관련 맛있는 가벼운 음식 :
protected void cmdPopulateImages_load(object sender, EventArgs e)
{
try
{
((System.Web.UI.WebControls.DropDownList)sender).DataSource = GetFileDictionary();
}
catch (Exception exc)
{
//Module failed to load
Exceptions.ProcessModuleLoadException(this, exc);
}
}
protected void cmdPopulateImages_prebind(object sender, EventArgs e)
{
try
{
((System.Web.UI.WebControls.DropDownList)sender).SelectedValue = "-1";
}
catch (Exception exc)
{
//Module failed to load
Exceptions.ProcessModuleLoadException(this, exc);
}
}
protected Dictionary<int, string> GetFileDictionary()
{
// Folder ID where images will be grabbed from. Will be put in settings.
int intFolderId = 20;
// Extensions that are allowed to be seen in the list. Will be put in settings.
List<string> slValidExtensions = new List<string>("gif,jpg,jpeg,png".Split(','));
slValidExtensions.ForEach(delegate(string ext) { ext.Trim(); });
// Grab a list of files and put it in a dictionary.
ArrayList alFiles = FileSystemUtils.GetFilesByFolder(PortalId, intFolderId);
Dictionary<int, string> dFiles = new Dictionary<int, string>();
dFiles.Add(-1, "---");
foreach (FileInfo fiFile in alFiles)
{
// Make sure we are looking at a valid extension
if (slValidExtensions.Contains(fiFile.Extension))
{
dFiles.Add(fiFile.FileId, fiFile.FileName);
}
}
return dFiles;
}
이제 내 질문 :
- 열을 편집하지 않으면 이미지가 표시됩니다. 그러나 이것은 실제 파일이 아닌 ID이므로 매우 유익하지 않습니다. 내 공격 계획은 해당 평가판을 해당 코드에 대한 관련 파일을 가져 와서 레이블의 .Text에 쓰는 onRender 코드 숨김에서 메소드를 시작하는 레이블로 변환하는 것입니다. ID를 찾을 수없는 경우 (예 : 사용자가 이미지를 삭제 한 경우) "누락 된 이미지" 그러나 문제는 해당 레이블을 기반으로하는 이벤트의 메서드에 실제로있을 때 특정 행에 대한 데이터에 액세스하는 방법을 알 수 없다는 것입니다.
- cmdPopulatedImages_Prebind에서 SelectedValue를 -1로 설정하면 비슷한 결과의 부산물로 표시됩니다. 그 방법에서 이미지 ID를 얻는 방법을 모르겠다. 이미지 ID가 실제로 존재하지 않는다면 모듈은 드롭 다운 목록에 존재하지 않기 때문에 내 얼굴에 오류를 던집니다. 그래서 -1로 항상 설정합니다 (데이터 사전의 빈 항목을 나타냄). 이미지 ID가 있으면 먼저 데이터 세트에 실제로 존재하는지 확인하고, 설정 한 경우 기본값 -1 값을 선택하지 않아도됩니다. 난 당신이 달성하기 위해 노력하고 정확히 모르겠지만 여기 내 최선의 노력이야 완전히 때문에
고맙습니다! RowDataBound가 티켓이었습니다!그러나 DataKeys와 RowIndex를 사용하는 대신 실제로 데이터를 얻는 방법이 훨씬 더 좋으므로 e.Row.DataItem 속성을 사용하여 데이터를 가져올 수 있습니다. 당신은 올바른 방향으로 나를 지적 했으니 여기에 체크 표시가되어 있습니다! – AlexMax
나는 Dataitem 속성을 알아 차리지 못했습니다. 그래서, 나는 너무 배웠습니다. 당신에게 좋은 녹색 진드기를 줄 수는 없지만 대신 여기에 투표가 있습니다. – Jamie