كيف يمكنني الحصول على القيمة المحددة من القائمة المنسدلة في وضع التحرير لعرض الشبكة?

StackOverflow https://stackoverflow.com/questions/5979048

سؤال

في طلبي ، عندما أقوم بتحرير صف في غريدفيو اخترت بعض البيانات الجديدة من دروبدوونليست.

أنا ملء القائمة المنسدلة مثل هذا:

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
                DropDownList emailsListDL = (DropDownList)e.Row.FindControl("emailsDL");
                emailsListDL.DataSource = allUsersEmails;//list of strings with the emails of the users
                emailsListDL.DataBind();
            }
        }
    }

ولكن عندما اضغط على زر 'تحديث' من القالب ويدخل في الحدث 'رووبداتينغ' ، القيمة المحددة من القائمة المنسدلة هي في كل مرة القيمة الأولى من تلك القائمة المنسدلة.

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        DropDownList emailsListDL = (DropDownList)GridViewAdvertisers.Rows[e.RowIndex].FindControl("emailsDL");
        string email = emailsListDL.SelectedValue; //the selected value is every time the first value from the dropdownlist
    }

هل لدى أي شخص أي أفكار?

لقد حاولت العديد من الطرق لتعيين القيمة المحددة في الحدث 'روداتابوند' ، ولكن مع عدم وجود الحظ.حاولت هذا:

1. emailsListDL.SelectedIndex = emailsListDL.Items.IndexOf(emailsListDL.Items.FindByValue(DataBinder.Eval(e.Row.DataItem, "OwnerMail").ToString()));
2. emailsListDL.SelectedValue = GridViewAdvertisers.DataKeys[e.Row.RowIndex]["OwnerMail"].ToString();
3. emailsListDL.SelectedValue = GridViewAdvertisers.Rows[e.Row.RowIndex].Cells[1].Text;
//ownerMail is a string (object) from the list of objects that I put as datasource to the gridview

شكرا, جيف

تحديث

قالب العنصر الخاص بي من صفحة أسبكس هو:

 <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle"
                ItemStyle-Width="150px" HeaderText="Owner Email" HeaderStyle-HorizontalAlign="Left"
                HeaderStyle-BorderWidth="1px" HeaderStyle-BorderColor="#e1e1e1">
                <ItemTemplate>
                    <asp:Label ID="LabelEmail" runat="server" Text='<%# Bind("OwnerMail")%>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="emailsDL" runat="server" Width="150">
                    </asp:DropDownList>
                </EditItemTemplate>
                <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Font-Bold="True"></HeaderStyle>
                <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="180px" BorderWidth="1px"
                    BorderColor="#e1e1e1"></ItemStyle>
    </asp:TemplateField>
هل كانت مفيدة؟

المحلول

سيقوم SELATINDEX دائما بالتخلف عن 0 إذا لم تحدده في تعريف القائمة المنسدلة.

تحرير: يجب على Tim Schmelter إضافة تعليقه كقضب.في غضون ذلك، سأعيد صياغة القارئين الآخرين: تحتاج إلى التحقق من عون البريد (انظر التعليقات أعلاه).

نصائح أخرى

يمكنك أن تعلن ComboBox mainBX = new Combobox(); ويمكنك إعلان حدث

private void onSeletedIndexChange(object sender,EventArgs e)
{
        mainBX = (ComboBox)(sender);
}

وبعد ذلك يجب عليك تكرار فوريتش كومبوبوكس في غريدفيو وإضافة هذا الحدث .من كل ما يجب عليك القيام به هو ، واتخاذ ماينبكس.سيليتيديتم();

أعتقد أن هذا هو ما تحتاجه ، إن لم يكن الاعتذار .

لتعيين القيمة المحددة في RowDataBound- حدث ، يجب أن تفعل ذلك مثل هذا:

(DropDownList)e.Row.Cells[/*index*/].Controls[/*index, or use FindControl*/]).Items.FindByValue(((DataRowView)e.Row.DataItem).Row.ItemArray[/*columnnumber*/].ToString()).Selected = true;

فيندبيفالو يجد تكستفالو الحالي للحقل في فيومود" عادي " ويحدد دروبدوونليست مع القيمة.

بالطبع هذا يحتاج إلى أن تكون مغلفة في

if ((e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit)
{
}

بالنسبة إلى "الحصول على القيمة عند التحديث"-المشكلة ، يجب أن أقول بصراحة أنه ليس لدي أي فكرة ، لأن نهجك يشبه أسلوبي تماما ، والفرق الوحيد:أعمال الألغام.

إليك الكود الخاص بي إذا كان هناك أي مساعدة:

 protected void gridVariables_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        string control = ((DropDownList)gridVariables.Rows[e.RowIndex].Cells[3].Controls[1]).SelectedValue;
        gridVariables.EditIndex = -1;
        this.gridVariables_DataBind(control, e.RowIndex);
    }

private void gridVariables_DataBind(string control, int index)
    {
        DataTable dt = (DataTable)Session["variableTable"]; //features a DataTable with the Contents of the Gridview
        dt.Rows[index]["ControlType"] = control;
        gridVariables.DataSource = dt;
        gridVariables.DataBind();
    }

كان لدي نفس المشكلة مع حل مختلف، لقد قمت بتنفيذ الترحيل المخصص على GRIDVIEW مع بيجر مخصص، وفي العملية أضافت طريقة RowCommand، التي كانت ترغب في إعادة تسمية الشبكة بمؤشر صفحة جديد.كما يحدث على الرغم من أن طريقة Rowcommand تسمى أيضا أثناء التحديث.

حتى تأكد من التحقق من أي مواقع أخرى قد تكون ملزمة في أي مكان في التعليمات البرمجية الخاصة بك. آمل أن يساعد هذا شخص آخر. giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top