2011-01-28 2 views
0

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; 
} 

이제 내 질문 :

  1. 열을 편집하지 않으면 이미지가 표시됩니다. 그러나 이것은 실제 파일이 아닌 ID이므로 매우 유익하지 않습니다. 내 공격 계획은 해당 평가판을 해당 코드에 대한 관련 파일을 가져 와서 레이블의 .Text에 쓰는 onRender 코드 숨김에서 메소드를 시작하는 레이블로 변환하는 것입니다. ID를 찾을 수없는 경우 (예 : 사용자가 이미지를 삭제 한 경우) "누락 된 이미지" 그러나 문제는 해당 레이블을 기반으로하는 이벤트의 메서드에 실제로있을 때 특정 행에 대한 데이터에 액세스하는 방법을 알 수 없다는 것입니다.
  2. cmdPopulatedImages_Prebind에서 SelectedValue를 -1로 설정하면 비슷한 결과의 부산물로 표시됩니다. 그 방법에서 이미지 ID를 얻는 방법을 모르겠다. 이미지 ID가 실제로 존재하지 않는다면 모듈은 드롭 다운 목록에 존재하지 않기 때문에 내 얼굴에 오류를 던집니다. 그래서 -1로 항상 설정합니다 (데이터 사전의 빈 항목을 나타냄). 이미지 ID가 있으면 먼저 데이터 세트에 실제로 존재하는지 확인하고, 설정 한 경우 기본값 -1 값을 선택하지 않아도됩니다. 난 당신이 달성하기 위해 노력하고 정확히 모르겠지만 여기 내 최선의 노력이야 완전히 때문에

답변

1

나는 ... 당신의 질문에 대답하고 있지 않다

당신이 바로, 당신의 ImageID 싶어? 쿼리에서 ImageID를 반환하면 "ImageID"를 GridView의 DataKeyNames 속성에 추가하십시오. 그렇게하면 각 행에 대해 액세스 할 수 있습니다.

유용한 방법이라고 생각되는 방법은 RowDataBound 메소드입니다. 이 함수는 각 행이 데이터 바인딩 될 때 호출됩니다 (분명히 ...). 그것을 사용하십시오, 그것은 당신의 친구입니다.

이 메서드에서 각 행에 대해 메서드 등을 호출 할 수 있습니다. e.Row.RowIndex을 사용하여 RowIndex를 가져올 수도 있습니다. 당신과 같은 무언가를 사용할 수있는 이미지 이미지 URL 속성 : 예는 ASP를 채우기 위해 당신의 "ImageID"을 얻기 위해 들어

var Image1 = (Image)e.Row.FindControl("Image1"); 
var imageId = Convert.ToInt32(GridView1.DataKeys[e.Row.RowIndex].Values["ImageID"]); 
Image1.ImageUrl = GetImageUrlFromId(imageId); //Get the url of your image 

을 또한 현재 ImageID의 올바른 SelectedValue를 선택하려면 드롭 다운 목록을 채울 수 .

이 정보가 도움이되기를 바랍니다. 코드가 내 머리 꼭대기에서 벗어 났으므로 몇 가지 문제가있을 수 있습니다.

요컨대. DataKeyNames 속성과 RowDataBound 이벤트를 사용하십시오.

+1

고맙습니다! RowDataBound가 티켓이었습니다!그러나 DataKeys와 RowIndex를 사용하는 대신 실제로 데이터를 얻는 방법이 훨씬 더 좋으므로 e.Row.DataItem 속성을 사용하여 데이터를 가져올 수 있습니다. 당신은 올바른 방향으로 나를 지적 했으니 여기에 체크 표시가되어 있습니다! – AlexMax

+0

나는 Dataitem 속성을 알아 차리지 못했습니다. 그래서, 나는 너무 배웠습니다. 당신에게 좋은 녹색 진드기를 줄 수는 없지만 대신 여기에 투표가 있습니다. – Jamie

관련 문제