2011-01-31 2 views
0

자동으로 생성 된 편집 단추가있는 GridView가 있습니다. 간단한 입력 필드가 아닌 항목의 드롭 다운 목록이되기를 원했기 때문에 Image 열에 대한 사용자 정의 된 동작을 원했습니다. 그리고 데이터베이스의 값이 실제로 그렇지 않은 경우를 대비하여 멋진 "fallback"을 원했습니다. 드롭 다운 목록에 존재합니다.C# DotNetNuke 모듈 : GridVIew AutoGenerateEditButton이 업데이트시 필드 위로 건너 뜁니다.

코드를 사용하여 지금까지 내가 수행 한 코드에서 Image 필드에서 원하는 동작을 얻었습니다. 내가 때문에, 좋지 않다

ObjectDataSource 'objDataSource' could not find a non-generic method 'UpdateDiscovery' that has parameters: ModuleId, Visible, Position, Title, Link, ItemId. 

: 문제는 내가 특정 필드를 업데이트 할 때, 나는 오류가 그것과 양식을 업데이트하는 방법을 찾을 수없는 나를 다시 뱉어 얻을 수 있다는 것입니다 UpdateDiscovery 메소드가 있습니다. 그러나 Title과 Link 사이에는 Image 필드에 속한 또 다른 매개 변수가 있어야하며 전달되지 않습니다. 그게 아마도 업데이 트 버튼이 그 필드를 전달하지 않는 것을 알게되면 TemplateField와 BoundField가 아니므로 Bind('image')을 드롭 다운 목록의 선택된 값으로 사용할 때 업데이트가 잘된 것 같습니다. 그러나 데이터베이스의 필드가 실제로 행이 존재할 때만 편집 할 수 있습니다. 그렇지 않으면 폭탄이 튀어 나와 드롭 다운 목록에없는 값에 대한 오류가 표시됩니다.

이 I는 다음의 GridView가 정의한 :

<asp:GridView ID="grdDiscoverys" runat="server" DataSourceID="objDataSource" EnableModelValidation="True" AutoGenerateColumns="false" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" DataKeyNames="ItemId" OnRowDataBound="cmdDiscovery_RowDataBound"> 
    <Columns> 
     <asp:BoundField DataField="ItemId" HeaderText="#" ReadOnly="true" /> 
     <asp:BoundField DataField="Visible" HeaderText="Visible" /> 
     <asp:BoundField DataField="Position" HeaderText="Position" /> 
     <asp:TemplateField HeaderText="Image"> 
      <ItemTemplate> 
       <asp:Label ID="lblViewImage" runat="server" /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlEditImage" runat="server" title="Image" DataValueField="Key" DataTextField="Value" /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="Title" HeaderText="Title" /> 
     <asp:BoundField DataField="Link" HeaderText="Link" /> 
    </Columns> 
</asp:GridView> 

이에 연결되는 데이터 소스 : 행의 데이터가 바인딩 될 때 호출되는

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

cmdDiscovery_RowDataBound 방법은 다음 C# 코드입니다 :

protected void cmdDiscovery_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    try 
    { 
     if (e.Row.RowIndex >= 0) 
     { 
      int intImage = ((DiscoveryInfo)e.Row.DataItem).Image; 

      if (grdDiscoverys.EditIndex == -1) 
      { 
       // View 
       Label lblViewImage = ((Label)e.Row.FindControl("lblViewImage")); 

       if (GetFileDictionary().ContainsKey(intImage)) 
       { 
        lblViewImage.Text = GetFileDictionary()[intImage]; 
       } 
       else 
       { 
        lblViewImage.Text = "Missing Image"; 
       } 
      } else { 
       // Edit 
       DropDownList ddlEditImage = ((DropDownList)e.Row.FindControl("ddlEditImage")); 
       ddlEditImage.DataSource = GetFileDictionary(); 
       ddlEditImage.DataBind(); 

       if (GetFileDictionary().ContainsKey(intImage)) 
       { 
        ddlEditImage.SelectedValue = intImage.ToString(); 
       } 
      } 
     } 
    } 
    catch (Exception exc) 
    { 
     //Module failed to load 
     Exceptions.ProcessModuleLoadException(this, exc); 
    } 
} 

어떻게해야합니까 th의 이미지 값 e 드롭 다운 목록이 업데이트 함수에 전달됩니까?

답변

0

objDataSource_Updating을 사용하면 도움이됩니다. ddlEditImage.SelectedValue

관련 문제