1

その中にページがありますgridview
gridviewは、情報と管理者ができる製品を示していますEdit gridviews columns
私のcolumnsショーのbrand name2つとcategory name各製品。
グリッドビューのItemTemplateタグでラベルを使用してこれらの2つの列の値を表示し、タグで2つの(branddrop、categorydrop)を使用してdropdownlistsこれら の2つの列の値を編集します。管理者がブランドドロップでアイテムを選択すると、categorydropには次のカテゴリ名が表示されます。ブランドドロップで選択したブランド名に関連しています。
EditItemTemplate

データベースのブランドテーブルのブランド名は次のとおりです。

サムスン、ノキア、ソニーエリクソン、アップル、LG、HTC...。

カテゴリテーブルの私のカテゴリ名は次のとおりです。

Galaxy Nexus、Galaxy Tab 2 7. 0、Galaxy S3、Asha、Lumia、iPhone、iPad、Xperia Arc、Xperia Neo、Xperia X8、Cookie 3g、Cookie lite、Km555e、Optimus l9、Optimus elite、Optimus g、wt18i、w8 、500、n8..。


をクリックするEdit buttonと、ブランドドロップの最初のアイテムはブランド可能に等しいです。

ItemTemplateのテキストとそれはうまく機能します私の問題は、カテゴリドロップの最初のアイテムがcategorylableと等しくないことです。

ItemTemplateのテキストとカテゴリドロップには、関連するカテゴリ名とブランド名は表示されません。
すべての製品について、iphoneとipadが表示されるため、ブランドドロップで別のアイテムを選択してから、その製品に関連する関連ブランド名を再度選択する必要があります。そうすると、categorydropに関連カテゴリ名のリストが表示されます。

使っbrandDrop_SelectedIndexChangedてみましGridView1_RowEditingたが動作しません。

私はそれを解決する方法がわかりません。

これは私の最初のコードです:

<asp:TemplateField HeaderText="brand name">
            <ItemTemplate>
                <asp:Label ID="brandname" runat="server" Text='<%#Eval("brand_name") %>'></asp:Label>
                <asp:Label ID="idfrombrand" runat="server" Text='<%#Eval("idfrombrands") %>' Visible="false"></asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Label ID="br" runat="server" Text='<%# Eval("idfrombrands") %>' Visible="false"></asp:Label><%--OnSelectedIndexChanged="brandDrop_SelectedIndexChanged" --%> 

                <asp:DropDownList  ID="brandDrop" runat="server" DataTextField="brand_name" DataValueField="id" DataSourceID="SqlDataSource4" AutoPostBack="true"  OnSelectedIndexChanged="brandDrop_SelectedIndexChanged" >
                </asp:DropDownList>
                <asp:SqlDataSource ID="SqlDataSource4" runat="server" ConnectionString="<%$ ConnectionStrings:mobile_storeConnectionString2 %>" SelectCommand="select [id],[brand_name] from [brands]" ></asp:SqlDataSource>
            </EditItemTemplate>
         </asp:TemplateField>

        <asp:TemplateField HeaderText="category name">
            <ItemTemplate>
                <asp:Label ID="catname" runat="server" Text='<%# Eval("category_name") %>'></asp:Label>
            </ItemTemplate>
           <EditItemTemplate>
               <asp:Label ID="OldCatName" runat="server" Text='<%# Eval("idfromCategories") %>' Visible="false"></asp:Label>
               <asp:DropDownList ID="categoryDrop" runat="server"  AutoPostBack="true" DataTextField="category_name" DataValueField="id" DataSourceID="SqlDataSource3">   <%-- --%>
               </asp:DropDownList>
               <asp:Label ID="cat" runat="server" Text='<%# Eval("idfromCategories") %>' Visible="false" ></asp:Label>
              <asp:SqlDataSource ID="SqlDataSource3" runat="server"   ConnectionString="<%$ ConnectionStrings:mobile_storeConnectionString2 %>" SelectCommand="select [category_name],[id],[idfrombrands] from [categories] where idfrombrands=@idfrombrands " >
                <SelectParameters>
                  <asp:ControlParameter ControlID="brandDrop" 
                    Name="idfrombrands" PropertyName="SelectedValue" Type="Int32"  />
                </SelectParameters>
               </asp:SqlDataSource>

           </EditItemTemplate>
        </asp:TemplateField>

これは、GridView1_RowDataBoundとGridView1_RowUpdatingの背後にある私のコードです。

 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
     int brand=0;
    int category=0;
    //Drop Brand--------------------------------------

    DropDownList list1 = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("brandDrop");
    Label lbl = (Label)GridView1.Rows[e.RowIndex].FindControl("br");

    if (list1.SelectedItem.Value != null)
    {
       brand  = Convert.ToInt32(list1.SelectedItem.Value);//NewIdFromBrand

    }
    else
    {
        brand = Convert.ToInt32(lbl.Text);

    }
    //Drop Category----------------------------------------

   DropDownList list2 = (DropDownList)GridView1.Rows[e.RowIndex].FindControl("categoryDrop");
   Label lbl2 = (Label)GridView1.Rows[e.RowIndex].FindControl("OldCatName");

    //int NewIdFromBrand2 = -1;
    if (list2.SelectedItem.Value != null)
    {
       category  = Convert.ToInt32(list2.SelectedItem.Value);//NewIdFromBrand2

    }
    else
    {

        category = Convert.ToInt32(lbl2.Text);
    }

    //Photo-------------------------------------------

    string photoname = System.Guid.NewGuid().ToString();

    GridViewRow row = GridView1.Rows[e.RowIndex];
    FileUpload fileUpload = row.FindControl("FileUploadimg") as FileUpload;
    Label lbl3 = (Label)GridView1.Rows[e.RowIndex].FindControl("oldImage"); 
    if (fileUpload != null && fileUpload.HasFile)
    {
        fileUpload.SaveAs(Server.MapPath("~/P_Image") + photoname + fileUpload.FileName);

        SqlDataSource1.UpdateParameters["path"].DefaultValue = "~/P_Image" + photoname + fileUpload.FileName;
    }
    else
    {
     SqlDataSource1.UpdateParameters["path"].DefaultValue = lbl3.Text;//oldImage.Text;
    }
    int prid = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value);
    SqlConnection cn = new SqlConnection();
    cn.ConnectionString = "server = . ; database = mobile_store ; Trusted_Connection=true";
    DataTable tb = new DataTable();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = cn;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "UpdateProduct";
    cmd.Parameters.AddWithValue("@brandid", brand );
    cmd.Parameters.AddWithValue("@catid", category );
    cmd.Parameters.AddWithValue("@pid", prid);
    try
    {
        cn.Open();
        cmd.ExecuteNonQuery();
        SqlDataSource1.DataBind();

    }
    catch (Exception ex2)
    {


    }
    finally { cn.Close(); }
    //GridView1.EditIndex = -1;
    //GridView1.DataBind();

}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //check if is in edit mode
        if ((e.Row.RowState & DataControlRowState.Edit) > 0)
        {
            DataRowView dRowView1 = (DataRowView)e.Row.DataItem;
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                {
                    DropDownList ddlStatus = (DropDownList)e.Row.FindControl("brandDrop");
                    ddlStatus.SelectedValue = dRowView1["brandId"].ToString();
                    DropDownList ddlStatus2 = (DropDownList)e.Row.FindControl("categoryDrop");
                    ddlStatus2.SelectedValue = dRowView1["categoryID"].ToString();
                    //Label1.Text = ddlStatus.SelectedValue;

                }
            }

        }

    }
}
4

4 に答える 4

1

アビデマサラウレ、どうもありがとうございました。あなたは私を大いに助けてくれました。grideview_roweditingイベントとbraddrop_selectedIndexChangeイベントを削除し、GridView1_RowDataBoundイベントに2行追加しました。

 SqlDataSource sq = (SqlDataSource)e.Row.FindControl("SqlDataSource3");
 sq.SelectParameters["idfrombrands"].DefaultValue = dRowView1["brandId"].ToString();

今私のイベントはこのようなものです:

  protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //check if is in edit mode
        if ((e.Row.RowState & DataControlRowState.Edit) > 0)
        {
            DataRowView dRowView1 = (DataRowView)e.Row.DataItem;
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((e.Row.RowState & DataControlRowState.Edit) > 0)
                {
                    DropDownList ddlStatus = (DropDownList)e.Row.FindControl("brandDrop");
                    ddlStatus.SelectedValue = dRowView1["brandId"].ToString();
                    DropDownList ddlStatus2 = (DropDownList)e.Row.FindControl("categoryDrop");
                    ddlStatus2.SelectedValue = dRowView1["categoryID"].ToString();

                    SqlDataSource sq = (SqlDataSource)e.Row.FindControl("SqlDataSource3");
                    sq.SelectParameters["idfrombrands"].DefaultValue = dRowView1["brandId"].ToString();
                }
            }

        }

    }
}
于 2013-01-05T15:37:12.537 に答える
0

ユーレカ!!!。あなたは私に一杯のコーヒーを借りています。私はあなたの問題を再現し、2時間後に、インデックスで選択された変更されたイベントに実際にフックする必要があることに気付きました。トリックは、名前付けコンテナのプロパティを使用してドロップダウンを見つけることです。彼らはかなり隠されていると思いますが、送信者の引数により、ドロップバンドドロップダウンが発生したときにそれらを公開できます。そして、prestoすべてが魅力のように機能します。

選択した変更されたイベントでこのコードスニペットを使用します。

protected void dropBand_SelectedIndexChanged(object sender, System.EventArgs e)
{

DropDownList dropBand = (DropDownList)sender;

SqlDataSource dsc = (SqlDataSource)dropBand.NamingContainer.FindControl("SqlDataSource3");
DropDownList categoryDrop = (DropDownList)dropBand.NamingContainer.FindControl("categoryDrop");
dsc.SelectParameters("BrandID").DefaultValue = dropBand.SelectedValue;
categoryDrop.DataBind();
}

問題が解決しない場合は、今回デモのzipファイルをお送りします。HappyCoding!!!。 デバッグ

于 2013-01-03T21:29:43.080 に答える
0

選択したインデックス変更イベントで使用しているコードを確認する必要があります。

次のカスケードドロップダウン手法は、親とその子を接続しようとする際のすべての苦痛を取り除きます...私はすべてのプロジェクトでAjax制御ツールキットのこの素晴らしい機能を使用しています。任意のデータ取得方法を使用できます。配列を返す限り必要です。この例では、データ取得にlinqを使用しています。Brand and Modelという名前のテーブルとクラス:Brand and Modelとコレクション:Brands and Models

'YourWebServicePath.asmx'(Webサービスファイル)

 <WebMethod()> _
    Public Function GetBrands(knownCategoryValues As String, category As String) As  CascadingDropDownNameValue()

        Dim result = From b As Bands In Brand.Brands Select New CascadingDropDownNameValue(b.BrandDesc, b.BrandID.ToString())
        Return result.ToArray()

    End Function


<WebMethod()> _
Public Function GetModels(knownCategoryValues As String, category As String) As CascadingDropDownNameValue()
    Dim brandID As Guid
    Dim brandValues As StringDictionary = AjaxControlToolkit.CascadingDropDown._
   ParseKnownCategoryValuesString(knownCategoryValues)
     brandID = New Guid(brandValues("Brand"))
    Dim result = From m As Models In Model.GetModels() Where m.brandID = brandID       Select New CascadingDropDownNameValue(m.ModelDesc, 
 _ m.ModelID.ToString())
    Return result.ToArray()
   End Function

マークアップ

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

    <EditItemTemplate>

                <asp:DropDownList  ID="dropBrand" runat="server" AutoPostBack="true" >
                </asp:DropDownList>


                    <cc1:CascadingDropDown ID="BrandCascadingDropDown"
                                           runat="server"
                                           Category="Brand"
                                           TargetControlID="dropBrand"
                                           PromptText="-Select Brand-"
                                           LoadingText="Loading Brands.."
                                           ServicePath="YourWebServicePath.asmx"

                                           ServiceMethod="GetBrands">
                   </cc1:CascadingDropDown>

</EditItemTemplate>

<EditItemTemplate>
                <asp:DropDownList  ID="dropModel" runat="server" AutoPostBack="true" >
                </asp:DropDownList>


           <cc1:CascadingDropDown ID="ModelCascadingDropDown"
                                           runat="server"
                                           Category="Model"
                                           TargetControlID="dropModel"
                                           ParentControlID="dropBrand"
                                           PromptText="-Select Model-"
                                           LoadingText="Loading Models.."

                                           ServicePath="YourWebServicePath.asmx"
                                           ServiceMethod="GetModels" >
                    </cc1:CascadingDropDown>

そして、それはあなたが必要とするすべてです。イベントを配線する必要はありません。そして出来上がり!ツールキットに魔法を実行させます。

于 2013-01-03T13:33:04.253 に答える
0

上記のコードを行編集イベントで使用するには、そのように変更する必要があります。そうすると、これらのオブジェクトはnullになりません。

 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView testgrid = (GridView)(sender);
    testgrid.EditIndex = e.NewEditIndex;
    testgrid.DataBind();
    DropDownList dropBand = (DropDownList)testgrid.Rows[e.NewEditIndex].FindControl("ddlProducts");

    //
}

あなたのページサイクルで何かが間違いなく起こっていて、あなたを噛み続けています。データベースのmdfと問題のあるaspxページを圧縮して、うまくいかない場合はここから取り組むことをお勧めします。決してあきらめないでください。

ここに画像の説明を入力してください

于 2013-01-05T13:24:08.303 に答える