简体   繁体   English

获取网格行命令事件上的下拉列表选择项

[英]Get the drop down list selected item on grid row command event

I have a manage Customer table and grid view customer .我有一个管理 Customer表和网格视图customer

I am trying to update grid record.我正在尝试更新网格记录。 I want when i click edit link records display in table.我想当我点击编辑链接记录显示在表中。

I am trying to do it on Grid_Row_command event .我正在尝试在Grid_Row_command 事件上执行此操作。

I am getting records on textbox but not able to get selected dropdown record.我在文本框中获取记录,但无法获取选定的下拉记录。

Please tell me how to do this.请告诉我如何做到这一点。

Here is snapshot of my table & Gridview.这是我的表格和 Gridview 的快照。

在此处输入图片说明

. .

Here is my code-这是我的代码-

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Mspl.Web.MobileTracking.BL;
using Mspl.MobileTracking.Model;

namespace Mspl.Web.MobileTracking.UserControls
{
    public partial class ManageCustomers : System.Web.UI.UserControl
    {
        Utility utility;
        string result = string.Empty;
        User user = new User();
        CustomerBL customerBL;
        Customer Customer = new Customer();
        CustomerBL Customers = new CustomerBL();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                BindCountry();
                BindCustomer();
            }

            lblMessage.Text = string.Empty;
        }

        private void BindStates()
        {
            utility = new Utility();
            var states = utility.GetStates(ddlCountry.SelectedItem.Value);
            ddlState.DataSource = states;
            ddlState.DataTextField = "Name";
            ddlState.DataValueField = "ID";
            ddlState.DataBind();
            ddlState.Items.Insert(0, "--Select--");
        }

        private void BindCountry()
        {
            utility = new Utility();
            var countries = utility.GetCountries();
            ddlCountry.DataSource = countries.ToList<Country>();
            ddlCountry.DataTextField = "Name";
            ddlCountry.DataValueField = "ID";
            ddlCountry.DataBind();
            ddlCountry.Items.Insert(0, "--Select--");
        }

        private void BindDistricts()
        {
            utility = new Utility();
            var districts = utility.GetDistricts(ddlState.SelectedItem.Value);
            ddlDistrict.DataSource = districts;
            ddlDistrict.DataTextField = "Name";
            ddlDistrict.DataValueField = "ID";
            ddlDistrict.DataBind();
            ddlDistrict.Items.Insert(0, "--Select--");
        }

        private void BindCustomer()
        {
            gvCustomer.DataSource = Customers.GetAllCustomers();
            gvCustomer.DataBind(); 
        }


        protected void gvCustomer_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "displayCustomer")
            {
                GridViewRow row = (GridViewRow)((Control)e.CommandSource).NamingContainer;
                hfCustomerId.Value = Convert.ToString(e.CommandArgument);
                Label lblCName = (Label)row.FindControl("lblCustomerName");
                txtCustomerName.Text = lblCName.Text;
                Label lblAdd1 = (Label)row.FindControl("lblAddressLine1");
                txtAddressline1.Text = lblAdd1.Text;
                Label lblAdd2 = (Label)row.FindControl("lblAddressLine2");
                txtAddressline2.Text = lblAdd2.Text;
                Label lblPhone = (Label)row.FindControl("lblPhone");
                txtPhone.Text = lblPhone.Text;
                Label lblMobile = (Label)row.FindControl("lblMobile");
                txtMobileNumber.Text = lblMobile.Text;
                Label lblCountry = (Label)row.FindControl("lblCountry");
                ddlCountry.SelectedIndex = Convert.ToInt32(lblCountry.Text);
                Label lblState = (Label)row.FindControl("lblState");
                ddlState.SelectedIndex = Convert.ToInt32(lblState.Text);
                Label lblDistrict = (Label)row.FindControl("lblDistrict");
                ddlDistrict.SelectedIndex = Convert.ToInt32(lblDistrict.Text);
                Label lblCity = (Label)row.FindControl("lblCity");
                txtCity.Text = lblCity.Text; 
            }
        }

        protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
        {
            BindStates();
        }

        protected void ddlState_SelectedIndexChanged(object sender, EventArgs e)
        {
            BindDistricts();
        }

        protected void btnUpdate_Click(object sender, EventArgs e)
        {
            Customer customers = new Customer();
            user = Session["UserDetails"] as User;
            customers.ID = hfCustomerId.Value;
            customers.Name = txtCustomerName.Text;
            customers.Mobile = txtMobileNumber.Text;
            customers.Phone = txtPhone.Text;
            customers.AddressLine1 = txtAddressline1.Text;
            customers.AddressLine2 = txtAddressline2.Text;
            customers.Country = ddlCountry.SelectedItem.Value;
            customers.State = ddlState.SelectedItem.Value;
            customers.District = ddlDistrict.SelectedItem.Value;
            customers.City = txtCity.Text;
            customers.UpdatedBy = user.ID;

            if (Page.IsValid)
            {
                var result = Customers.UpdateCustomer(customers);
                if (result == "Success")
                    lblMessage.Text = "Sucessfully Updated";
                else
                    lblMessage.Text = "Already Exists";

                BindCustomer();
                refreshControls();
            }

            setFormstatus(0);

        }
    }
}

My grid Code-我的网格代码-

<asp:HiddenField ID="hfCustomerId" runat="server" />
                <asp:GridView ID="gvCustomer" runat="server" AutoGenerateColumns="False" CellPadding="4"
                    EnableModelValidation="True" ForeColor="#333333" GridLines="Both" 
                    onrowcommand="gvCustomer_RowCommand" onrowcreated="gvCustomer_RowCreated">
                    <AlternatingRowStyle BackColor="White" />
                    <EditRowStyle BackColor="#2461BF" />
                    <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                    <HeaderStyle HorizontalAlign="Left" CssClass="normalText" BackColor="#507CD1" Font-Bold="True"
                        ForeColor="White" />
                    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                    <RowStyle BackColor="#EFF3FB" />
                    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                    <Columns>
                        <asp:TemplateField HeaderText="Id">
                            <ItemTemplate>
                                <asp:Label ID="lblCustomerId" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Name">
                            <ItemTemplate>
                                <asp:Label ID="lblCustomerName" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="AddressLine1">
                            <ItemTemplate>
                                <asp:Label ID="lblAddressLine1" runat="server" Text='<%# Bind("AddressLine1") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="AddressLine2">
                            <ItemTemplate>
                                <asp:Label ID="lblAddressLine2" runat="server" Text='<%# Bind("AddressLine2") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Mobile">
                            <ItemTemplate>
                                <asp:Label ID="lblMobile" runat="server" Text='<%# Bind("Mobile") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                         <asp:TemplateField HeaderText="Phone">
                            <ItemTemplate>
                                <asp:Label ID="lblPhone" runat="server" Text='<%# Bind("Phone") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="Country">
                            <ItemTemplate>
                                <asp:Label ID="lblCountry" runat="server" Text='<%# Bind("Country") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="State">
                            <ItemTemplate>
                                <asp:Label ID="lblState" runat="server" Text='<%# Bind("State") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="District">
                            <ItemTemplate>
                                <asp:Label ID="lblDistrict" runat="server" Text='<%# Bind("District") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="City">
                            <ItemTemplate>
                                <asp:Label ID="lblCity" runat="server" Text='<%# Bind("City") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField>
                            <ItemTemplate>
                                <asp:LinkButton ID="linkName" runat="server" Text="Edit" CommandName="displayCustomer"  CommandArgument='<%# Eval("ID")%>' >
                                </asp:LinkButton>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>

you have find the dropdown, fill it first with your state lists then use like你找到了下拉菜单,先用你的状态列表填充它,然后使用像

ddlState.Items.FindbyText(lblState.text).Selected=true;

you can try like this你可以这样试试

if (e.commandname == "displayCustomer") {
    GridViewRow gv = (GridViewRow)((Control)e.CommandSource).NamingContainer;
    label lblCountry = gv.findControl("lblCountry");
    label lblState = gv.findcontrol("lblState");
    label lblDistrict = gv.findcontrol("lblDistrict");


    //call function to fill your country


    ddlCountry.items.finbytext(lblCountry.text).selected = true;

    //call function to fill states based on ddlcountry selected item

    ddlState.items.finbytext(lblState.text).selected = true;


    //call function to fill district based on ddlStateselected item

    ddlDistrict.items.finbytext(lblDistrict.text).selected = true;



}

Actually you don't need to perform all this code.实际上,您不需要执行所有这些代码。

Label lblCountry = (Label)row.FindControl("lblCountry");
ddlCountry.SelectedIndex = Convert.ToInt32(lblCountry.Text);
Label lblState = (Label)row.FindControl("lblState");
ddlState.SelectedIndex = Convert.ToInt32(lblState.Text);
Label lblDistrict = (Label)row.FindControl("lblDistrict");
ddlDistrict.SelectedIndex = Convert.ToInt32(lblDistrict.Text);

One better way is :一种更好的方法是:

<asp:LinkButton ID="linkName" runat="server" Text="Edit" CommandName="displayCustomer"  CommandArgument='<%# Eval("ID")%>' ></asp:LinkButton>



public void gvCustomer_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        // Here "i" is the id(CommandArgument='<%# Eval("ID")%>') of the record 
        //coming from the link button.
        int i = Convert.ToInt32(e.CommandArgument);

        if (e.CommandName == "Edit1")
        {

            // Execute your Database query with where condition for "i" 
            // and fetch the value in data reader. The Query will be like 
            // Select * from Table_Name where ID = i
            // This will get you the particular record for that ID only

            while (dr.Read())
            {
                DrpCountry.SelectedItem.Value = dr["CountryID"].ToString();
                DrpState.SelectedItem.Value = dr["StateID"].ToString();
                DrpDistrict.SelectedItem.Value = dr["DistrictID"].ToString();
            }
        }
    }

select a particular value of drop down from从下拉列表中选择一个特定的值

ddlCountry.SelectedIndex=ddlCountry.Items.IndexOf(ddlCountry.Items.FindByText(lblCountry.Text)); ddlCountry.SelectedIndex=ddlCountry.Items.IndexOf(ddlCountry.Items.FindByText(lblCountry.Text));

UPDATE:更新:

The problem is, when you select the value in your Country DropDown , it is already filled, while your State and City DropDown s are NOT filled that is why they are NOT working,问题是,当您选择 Country DropDown的值时,它已被填充,而您的 State 和 City DropDown未填充,这就是它们不起作用的原因,

    protected void gvCustomer_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "displayCustomer")
        {
            GridViewRow row = (GridViewRow)((Control)e.CommandSource).NamingContainer;
            hfCustomerId.Value = Convert.ToString(e.CommandArgument);
            Label lblCName = (Label)row.FindControl("lblCustomerName");
            txtCustomerName.Text = lblCName.Text;
            Label lblAdd1 = (Label)row.FindControl("lblAddressLine1");
            txtAddressline1.Text = lblAdd1.Text;
            Label lblAdd2 = (Label)row.FindControl("lblAddressLine2");
            txtAddressline2.Text = lblAdd2.Text;
            Label lblPhone = (Label)row.FindControl("lblPhone");
            txtPhone.Text = lblPhone.Text;
            Label lblMobile = (Label)row.FindControl("lblMobile");
            txtMobileNumber.Text = lblMobile.Text;
            Label lblCountry = (Label)row.FindControl("lblCountry");


            // -------------------------- changed code --------------------------

            ddlCountry.SelectedIndex = ddlCountry.Items.IndexOf(ddlCountry.Items.FindByText(lblCountry.Text))


            // at this point country should be filled and selected, so we can bind and select appropriate state
            BindStates();

            Label lblState = (Label)row.FindControl("lblState");
            ddlSate.SelectedIndex = ddlSate.Items.IndexOf(ddlSate.Items.FindByText(lblState.Text))

            // at this point states should be filled and selected, so we can bind and select appropriate District
            BindDistricts();


            Label lblDistrict = (Label)row.FindControl("lblDistrict");
            ddlDistrict.SelectedIndex = ddlDistrict.Items.IndexOf(ddlDistrict.Items.FindByText(lblDistrict.Text))

            //---------------------------------------------------------------------

            Label lblCity = (Label)row.FindControl("lblCity");
            txtCity.Text = lblCity.Text; 
        }
    }

As you have mentioned in you comments that Country column in GridView is actually Country Name NOT Country ID.正如您在评论中提到的, GridView中的Country列实际上是 Country Name NOT Country ID。 While you are converting this lblCountry.Text into int32 and trying set the index.当您将此lblCountry.Text转换为int32并尝试设置索引时。 This should give the error I suppose.这应该给出我认为的错误。

The approach you have currently adopted does NOT seem to right, a better approach may be is to save the ID of the record in the Grid in some HiddenField for example, and on RowCommand , pick the ID from HiddenField , get the data from Database and then load in your input boxes.您目前采用的方法似乎不正确,更好的方法可能是将网格中记录的 ID 保存在某些HiddenField ,例如,在RowCommand ,从HiddenField选择 ID,从数据库中获取数据,然后然后加载您的输入框。

Anyway for a workaround, save the CountryID along with your Country Name in a HiddenField ,无论如何,作为一种解决方法,将CountryID与您的国家名称一起保存在HiddenField

<asp:TemplateField HeaderText="Country">
    <ItemTemplate>
        <asp:Label ID="lblCountry" runat="server" Text='<%# Bind("Country") %>'></asp:Label>
        <asp:HiddenField ID="hfCountryID" runat="server" Value='<%# Bind("CountryID") %>'></asp:HiddenField>
    </ItemTemplate>
</asp:TemplateField>

Then you can set the DropDown using this CountryID然后你可以使用这个CountryID设置DropDown

var hfCountryID = row.FindControl("hfCountryID") as HiddenField;
ddlCountry.SelectedValue = Convert.ToInt32(hfCountryID.Text); 

Another workaround can be to find the Item using Country Name and select it,另一种解决方法是使用国家/地区名称查找项目并选择它,

ddlCountry.SelectedIndex = ddlCountry.Items.IndexOf(ddlCountry.Items.FindByText(lblCountry.Text));

您所需要的只是创建一个函数来获取国家或州的 ID 或任何您可以执行的操作:

ddlCounty.SelectedValue=CountyID.ToString();

Try this,尝试这个,

ddlCountry.SelectedIndex = ddlCountry.Items.IndexOf
(ddlCountry.Items.FindByText(lblCountry.Text);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM