我有一个管理客户表和网格视图客户。
我正在尝试更新网格记录。我想点击编辑链接记录显示在表格中。
我正在 Grid_Row_command事件上尝试。
我正在获取文本框上的记录但无法获得选定的下拉记录。
请告诉我怎么做。
这是我桌子的快照& gridview的。
这是我的代码 -
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);
}
}
}
我的网格代码 -
<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>
答案 0 :(得分:0)
您已找到下拉列表,先填写状态列表,然后使用 喜欢
ddlState.Items.FindbyText(lblState.text).Selected=true;
你可以这样尝试
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;
}
答案 1 :(得分:0)
实际上您不需要执行所有这些代码。
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);
一种更好的方法是:
<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();
}
}
}
答案 2 :(得分:0)
从
中选择一个特定的下拉值ddlCountry.SelectedIndex = ddlCountry.Items.IndexOf(ddlCountry.Items.FindByText(lblCountry.Text));
答案 3 :(得分:0)
<强>更新强>
问题是,当您选择国家/地区DropDown
中的值时,它已被填充,而您的州和城市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;
}
}
正如您在评论中提到的,Country
中的GridView
列实际上是国家/地区名称而非国家/地区ID。在将此lblCountry.Text
转换为int32
并尝试设置索引时。这应该给出我想的错误。
您目前采用的方法似乎不正确,更好的方法可能是在某些HiddenField
中保存网格中记录的ID,并在RowCommand
上选择来自HiddenField
的ID,从数据库中获取数据,然后加载到输入框中。
无论如何要解决此问题,请将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>
然后,您可以使用此DropDown
CountryID
var hfCountryID = row.FindControl("hfCountryID") as HiddenField;
ddlCountry.SelectedValue = Convert.ToInt32(hfCountryID.Text);
另一种解决方法是使用国家/地区名称查找项目并选择它,
ddlCountry.SelectedIndex = ddlCountry.Items.IndexOf(ddlCountry.Items.FindByText(lblCountry.Text));
答案 4 :(得分:0)
您只需要创建一个获取国家/地区或国家/地区ID的函数 那么你可以这样做:
ddlCounty.SelectedValue=CountyID.ToString();
答案 5 :(得分:-1)
试试这个,
ddlCountry.SelectedIndex = ddlCountry.Items.IndexOf
(ddlCountry.Items.FindByText(lblCountry.Text);