2017-05-03 10 views
0

異なるページで使用されているコントロールがありますが、特定のページでドロップダウンが表示され、データベース。ドロップダウンには2つの項目(「出席日」と「出席日」)があり、コントロールにアクセスしたときに読み込まれるデータベースのオプションが必要です。ここで選択した値(非表示の列)を使用してデータベースからのドロップダウンを設定する

は私のグリッドビューの上の部分です。ここで

<asp:GridView runat="server" DataSourceID="sdsLookups" ID="gvValues" 
AutoGenerateColumns="False" Width="760px" OnDataBound ="GridView_DataBound"> 

は、グリッドビュー内の実際のドロップダウンです。正しいページで、適切な値がデータベースからロードされています。

<asp:TemplateField HeaderText="Is Attendance?"> 
    <ItemTemplate> 
     <asp:DropDownList id="ddlAttendanceStatus" AutoPostBack="True" runat ="server" SelectedValue='<%# Eval("rules") %>' > 
      <asp:ListItem>Attendance Day</asp:ListItem> 
      <asp:ListItem>Not Attendance Day</asp:ListItem> 
     </asp:DropDownList> 
    </ItemTemplate> 
</asp:TemplateField> 

ここでは現在、列を非表示にするためのコードです。私はまた、アイテムがnullであるかどうかを確認しようとするんだけど、私はまだ仕事にそれを持っていない:

protected void GridView_DataBound(object sender, EventArgs e) 
{ 
    if (this.LookupType == "Day Status" ? true : false) 
    { 
     gvValues.Columns[12].Visible = true; 
     GridViewRow row = (sender as Control).Parent.Parent as GridViewRow; 
     DropDownList rules = (row.FindControl("ddlAttendanceStatus") as DropDownList); 
     ListItem item = rules.Items.FindByText("Attendance Day"); 
     if (item != null) 
      rules.Items.FindByText("Attendance Day").Selected = true; 
    } 
} 

現在のところ、列は唯一の正しいページに表示されますが、ときに私このコントロールを使用して他のページに行き、私が言うのエラーが表示されます。

ArgumentOutOfRangeException: 'ddlAttendanceStatus' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value 

私はこのエラーを取得していますなぜ知っているが、私はこの問題を回避するかどうかはわかりません。私が正しいページにいない場合、このフィールドを完全に無視する方法はありますか?または、私が取るべき別のルートがありますか?

詳細をお知らせください。

ありがとうございます。

答えて

0

問題はaspxページのこのコード部分です:SelectedValue='<%# Eval("rules") %>'。他のページでrulesが存在しないか、Attendance DayまたはNot Attendance Day以外の値を指定した場合は、そのエラーが発生します。これはOnRowDataBoundイベントのSelectedValueに設定することで解決できます。

protected void gvValues_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    //check if the row is a datarow 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //cast the row back to a datarowview 
     DataRowView row = e.Row.DataItem as DataRowView; 

     //find the dropdownlist with findcontrol 
     DropDownList rules = e.Row.FindControl("ddlAttendanceStatus") as DropDownList; 

     if (row["myColumn"].ToString() == "Day Status") 
     { 
      //set the correct selectedvalue 
      rules.SelectedValue = "Not Attendance Day"; 

      //or 
      rules.SelectedValue = "1"; 
     } 
    } 
} 

の背後にあるコードで、その後

まず

<asp:GridView runat="server" DataSourceID="sdsLookups" ID="gvValues" 
    AutoGenerateColumns="False" Width="760px" OnDataBound="GridView_DataBound" 
    OnRowDataBound="gvValues_RowDataBound"> 

へのaspxの変更のGridViewそして最後にオプションとして、私はあなたのListItemとしてキー/値の使用をお勧めします。これにより、長い文字列での作業が容易になります。

<asp:DropDownList ID="ddlAttendanceStatus" AutoPostBack="True" runat="server"> 
    <asp:ListItem Text="Attendance Day" Value="0"></asp:ListItem> 
    <asp:ListItem Text="Not Attendance Day" Value="1"></asp:ListItem> 
</asp:DropDownList> 

更新

スタートのGridView自体からDataSourceIDを除去し、分離コードに移動することによって。

if (!Page.IsPostBack) 
{ 
    GridView1.DataSource = yourSource; 
    GridView1.DataBind(); 
} 

そして、あなたは、DropDownListコントロールにTrueにAutoPostBackセットを持っていますが、ポストバックを処理していないようです。そこに何も起こっていない場合は削除してください。また、グリッド内のデータを編集したり更新したりするには、this tutorialをご覧ください。それはすべての基本をカバーします。

+0

ありがとうございました。ロードに適切な値を取得できましたが、別の問題が発生しました。グリッドビューでは、ドロップダウンの値を変更し、データベースの値を変更するために「更新」ボタンをクリックする必要があります。ただし、このソリューションでは、ドロップダウン値を変更すると、画面がリフレッシュされ、データベースに格納されている値に戻されます。 –

+0

私の答えを更新しました。 – VDWWD

+0

これは機能しました。ありがとうございました! –

関連する問題