2017-01-05 17 views
0

グリッドビューに2つの列Customer TypeFile Frequencyがあります。グリッドがノーマルモードのときは、ラベルを使って値を表示します。行の編集時に、これらの2つの列がドロップダウンになります。 OnRowDataBound="RowDataBound"を使用してドロップダウンをバインドします。しかし、RowDataBoundメソッドが編集モードでバインドする方法の最初のドロップダウン(このメソッドで最初に書かれたもの)のみ。行の編集時にgridviewの複数のドロップダウンリストをバインドできません

の.aspx

<asp:GridView ID="gvManageCustomers" DataKeyNames="Ship_To" runat="server" AutoGenerateColumns="False" 
    OnRowEditing="EditCustomer" OnRowDataBound="RowDataBound" OnRowUpdating="UpdateCustomer" 
    OnRowCancelingEdit="CancelEdit" CssClass="table table-bordered table-condensed"> 
    <Columns> 
     <asp:TemplateField HeaderText="Customer Type"> 
      <ItemTemplate> 
       <asp:Label ID="lblCustType" runat="server" Text='<%# Eval("Customer_Type")%>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:Label ID="lblCustType" runat="server" Text='<%# Eval("Customer_Type")%>' Visible="false"> 
       </asp:Label> 
       <asp:DropDownList ID="ddlgvCustomerType" runat="server"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="File Frequency"> 
      <ItemTemplate> 
       <asp:Label ID="lblFileFreq" runat="server" Text='<%# Eval("FileFrequency")%>'></asp:Label> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:Label ID="lblFileFreq" runat="server" Text='<%# Eval("FileFrequency")%>' Visible="false"></asp:Label> 
       <asp:DropDownList ID="ddlgvFileFreq" runat="server"> 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField ShowEditButton="True" /> 
    </Columns> 
</asp:GridView> 

の.cs

public DataTable FetchCustomerType() 
{ 
    string sql = "select distinct Customer_TypeID,Customer_Type from tbl_CustomerType"; 
    SqlDataAdapter da = new SqlDataAdapter(sql, constr); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    return dt; 
} 
public DataTable FetchFileFrequency() 
{ 
    string sql = "SELECT distinct FileFrequency_ID,FileFrequency FROM [tbl_FileFrequency]"; 
    SqlDataAdapter da = new SqlDataAdapter(sql, constr); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    return dt; 
} 
protected void RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    try 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
      { 
       DropDownList ddlgvFileFreq = (DropDownList)e.Row.FindControl("ddlgvFileFreq"); //getting binded 
       ddlgvFileFreq.DataSource = FetchFileFrequency(); 
       ddlgvFileFreq.DataTextField = "FileFrequency"; 
       ddlgvFileFreq.DataValueField = "FileFrequency_ID"; 
       ddlgvFileFreq.DataBind(); 
       ddlgvFileFreq.Items.FindByValue((e.Row.FindControl("lblFileFreq") as Label).Text).Selected = true; 

       DropDownList ddlgvCustomerType = (DropDownList)e.Row.FindControl("ddlgvCustomerType"); 
       ddlgvCustomerType.DataSource = FetchCustomerType(); 
       ddlgvCustomerType.DataTextField = "Customer_Type"; 
       ddlgvCustomerType.DataValueField = "Customer_TypeID"; 
       ddlgvCustomerType.DataBind(); 
       ddlgvCustomerType.Items.FindByValue((e.Row.FindControl("lblCustType") as Label).Text).Selected = true; 

      } 
     } 

    } 
    catch (Exception ex) 
    { 
     //log error 
     errorlog.WriteErrorLog(ex.ToString()); 
    } 
} 
+0

私は 'OnRowEditing'イベントで' DDLs'をバインドすることをお勧めします。 – Null

答えて

0

問題は、この行では、それはexeptionをtrowsあります。そのため、一番上のバインディングだけが機能します。

ddlgvFileFreq.Items.FindByValue((e.Row.FindControl("lblFileFreq") as Label).Text).Selected = true; 

ただし、DropDownListに正しいSelectedValueが含まれているように見えます。これがあなたのやり方です。

DataRowView row = e.Row.DataItem as DataRowView; 

DropDownList ddlgvFileFreq = (DropDownList)e.Row.FindControl("ddlgvFileFreq"); 
ddlgvFileFreq.DataSource = FetchFileFrequency(); 
ddlgvFileFreq.DataTextField = "FileFrequency"; 
ddlgvFileFreq.DataValueField = "FileFrequency_ID"; 
ddlgvFileFreq.DataBind(); 
try 
{ 
    ddlgvFileFreq.SelectedValue = row["FileFrequency_ID"].ToString(); 
} 
catch 
{ 
} 

DropDownList ddlgvCustomerType = (DropDownList)e.Row.FindControl("ddlgvCustomerType"); 
ddlgvCustomerType.DataSource = FetchCustomerType(); 
ddlgvCustomerType.DataTextField = "Customer_Type"; 
ddlgvCustomerType.DataValueField = "Customer_TypeID"; 
ddlgvCustomerType.DataBind(); 
try 
{ 
    ddlgvCustomerType.SelectedValue = row["Customer_TypeID"].ToString(); 
} 
catch 
{ 
} 
+0

それは例外を投げていませんでした。私はあなたの解決策を試みましたが、同じ問題はまだあります。 – Raviteja

+0

'try catch'ブロックを削除するとどうなりますか?テストするとうまく動作するからです。 'ddlgvFileFreq.SelectedValue'にエラーがある場合は、グリッドとドロップダウンのバインドに使用するデータセットが一致しないことを意味します。 – VDWWD

+0

エラーが「キャッチされていないエラー:Sys.WebForms.PageRequestManagerServerErrorException:FileFrequency_IDがDataColumnでもテーブルのDataRelationでもありません。(...)」 – Raviteja

-1
<asp:TemplateField HeaderText="Customer Type"> 
            <ItemTemplate> 
             <asp:Label ID="lblCustType" runat="server" Text='<%# Eval("Customer_Type")%>'></asp:Label> 
             <asp:Label ID="lblCustTypeID" runat="server" Visible="false" Text='<%# (Eval("Customer_TypeID")) %>' /> 
            </ItemTemplate> 
            <EditItemTemplate>          
             <asp:DropDownList ID="ddlgvCustomerType" runat="server" DataSource="<%# FetchCustomerType() %>" DataValueField="Customer_TypeID" DataTextField="Customer_Type" > 
             </asp:DropDownList> 
            </EditItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="File Frequency"> 
            <ItemTemplate> 
             <asp:Label ID="lblFileFreq" runat="server" Text='<%# Eval("FileFrequency")%>'></asp:Label> 
             <asp:Label ID="lblFileFreqID" runat="server" Visible="false" Text='<%# (Eval("FileFrequency_ID")) %>' /> 
            </ItemTemplate> 
            <EditItemTemplate>          
             <asp:DropDownList ID="ddlgvFileFreq" runat="server" DataSource="<%# FetchFileFrequency() %>" DataValueField="FileFrequency_ID" DataTextField="FileFrequency" > 
             </asp:DropDownList> 
            </EditItemTemplate> 
           </asp:TemplateField> 
onRowEditingイベントで

((DropDownList)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("ddlgvCustomerType")).SelectedValue = ((Label)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("lblCustTypeID")).Text; 
          ((DropDownList)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("ddlgvFileFreq")).SelectedValue = ((Label)gvManageCustomers.Rows[e.NewEditIndex].Cells[0].FindControl("lblFileFreqID")).Text; 
関連する問題