我在一个datagrid中,当使用编辑时加了一个dropdownlist,我的目的是在编辑时在下拉框中进行选择,然后update,可现在的问题是,我在update时无法取得正确的值,总是取得第一个条目。
DataGrid的代码:
<Columns>
<asp:TemplateColumn HeaderText="状态" ItemStyle-Width="20%" HeaderStyle-HorizontalAlign="left">
<ItemTemplate >
<asp:Label id="lbusername" Runat =server Visible=True>
<%# DataBinder.Eval(Container,"DataItem.username")%>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="状态" ItemStyle-Width="20%" HeaderStyle-HorizontalAlign="left">
<ItemTemplate >
<asp:Label id="role" Runat =server Visible=True>
<%# DataBinder.Eval(Container,"DataItem.typename")%>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList Width=100px ID="ddltype" Runat="server"
DataSource ="<%# Gettypes() %>" DataTextField ="name"
DataValueField="value"></asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="修改状态" ItemStyle-Width="20%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:LinkButton ID="edit" Runat="server" CommandName="edit">修改</asp:LinkButton>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="save" Runat="server" commandname="update"  
CommandArgument =<%# DataBinder.Eval(Container,"DataItem.id")%>
CssClass="buts">保存</asp:LinkButton>
<asp:LinkButton ID="cancel" Runat="server" commandname="cancel"  
CssClass="buts">取消</asp:LinkButton>
</EditItemTemplate>
</asp:TemplateColumn>
</Columns> 
dropdownlist帮定的数据源:
protected DataTable Gettypes()
{

DataTable dt=new DataTable("attendancelist");
DataColumn dc=new DataColumn();
dc.ColumnName="value";
dc.DataType= System.Type.GetType("System.Int32");
dt.Columns.Add(dc);
dc=new DataColumn ();
dc.ColumnName="name";
dc.DataType= System.Type.GetType("System.String");
dt.Columns.Add(dc);
DataRow dr;
dr=dt.NewRow ();
dr["value"]=0;
dr["name"]="未考勤";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=1;
dr["name"]="正常上班";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=2;
dr["name"]="值班";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=3;
dr["name"]="病假";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=4;
dr["name"]="事假";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=5;
dr["name"]="迟到";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=6;
dr["name"]="缺席";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=7;
dr["name"]="休假";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=8;
dr["name"]="上班+加班";
dt.Rows.Add (dr);
dr=dt.NewRow ();
dr["value"]=9;
dr["name"]="值班+加班";
dt.Rows.Add (dr);
return dt;
}
update时的代码:
private void dgAttendance_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.Item.ItemType==ListItemType.EditItem)
{
int Attid=Int32.Parse(e.CommandArgument.ToString ()) ;
DropDownList  ddl=(DropDownList)e.Item.FindControl("ddltype");
dgos.EditItemIndex = -1;
this.BindDb ();
this.Response .Write("Attid:"+Attid+"<br>");
this.Response .Write("index:"+ddl.SelectedIndex  +"<br>");
this.Response .Write("name:"+ddl.SelectedItem .Text +"<br>");
this.Response .Write("value:"+ddl.SelectedItem .Value  +"<br>");

}
}

解决方案 »

  1.   

    参考一下代码
    <TD>Type:</TD>
    <TD>
    <ASP:DROPDOWNLIST id="Type" Runat="server" width="100%" DataTextField="Text" DataValueField ="Value" DataMember ="ListType" DataSource="<%# getTypeList()%>" SelectedIndex="<%# getTypeIndex(Container.DataItem)%>">
    </ASP:DROPDOWNLIST>
    </TD>
    //***********
    protected int getTypeIndex(object item)
    {
    try
    {
    DataRowView drv=(DataRowView)item;
    string val=drv["Type"].ToString();
    IList list=getTypeList();
    for(int i=0;i<list.Count;i++)
    {
    if(((ListItem)list[i]).Text.ToLower()==val.ToLower())
    {
    return i;
    }
    }
    }
    catch
    {
    return 0;
    }
    return 0;

    }
    // load data
    protected IList getTypeList()
    {
    return QuestionnaireLogic.ListAddressType();//返回dropdownlist填充内容
    }
      

  2.   

    你的dropdownlist没有拌定在if(!IsPostBack)中吧
      

  3.   


    public void Page_Load(....)
    {
    if(!Page.IsPostBack)
    {
      BindDrowDownList();
    }
    }
      

  4.   

    在Page_Load(....)的if(!IsPostBack)中加绑定!
      

  5.   

    我是在aspx的代码里写的帮定啊,
    asp:DropDownList Width=100px ID="ddltype" Runat="server"
    DataSource ="<%# Gettypes() %>" DataTextField ="name"
    DataValueField="value"></asp:DropDownList>
    不是在page-load里做的数据帮定。为什么这样每次只能取到第一个的值。
      

  6.   

    http://www.cnblogs.com/lovecherry/archive/2005/03/25/125525.html
      

  7.   

    我按照http://www.cnblogs.com/lovecherry/archive/2005/03/25/125525.html写的:
    可还是不行
    <asp:TemplateColumn HeaderText="状态" ItemStyle-Width="20%" HeaderStyle-HorizontalAlign="left">
    <ItemTemplate >
    <asp:Label id="role" Runat =server Visible=True>
    <%# DataBinder.Eval(Container,"DataItem.typename")%>
    </asp:Label>
    </ItemTemplate>
    <EditItemTemplate> <asp:DropDownList Width=100px ID="ddltype" Runat="server"></asp:DropDownList>
    </EditItemTemplate>
    </asp:TemplateColumn>private void dgAttendance_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.EditItem)
    {
    DropDownList ddl=(DropDownList)e.Item.FindControl("ddltype");
    ddl.DataSource=this.Gettypes ();
    ddl.DataTextField="name";
    ddl.DataValueField="value";
    ddl.DataBind();
    }
    }
    private void dgAttendance_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.EditItem)
    {
    int Attid=Int32.Parse(e.CommandArgument.ToString ()) ;
    //DropDownList  ddl=(DropDownList)e.Item.FindControl("ddltype");
    DropDownList  ddl=(DropDownList)e.Item.Cells [2].Controls [1];
    //Organize.TitleEdit  (Titleid,title_name.Text );

    int a=0;
    for (a=0;a<=9;a++)
    {
    this.Response.Write (ddl.Items[a].Value.ToString () +ddl.Items [a].Selected.ToString () +"<br>");
    }

    this.Response .Write("Attid:"+Attid+"<br>");
    this.Response .Write("index:"+ddl.SelectedIndex  +"<br>");
    this.Response .Write("name:"+ddl.SelectedItem .Text +"<br>");
    this.Response .Write("value:"+ddl.SelectedItem .Value  +"<br>");
    this.Response .Write("haha:"+((DropDownList)e.Item.Cells [2].Controls [1]).SelectedItem.Value +"<br>");
    dgos.EditItemIndex = -1;
    this.BindDb ();

    }
    }
      

  8.   

    page_load代码贴出来
    绑定datagrid的代码放到if(!IsPostBack)
      

  9.   

    我是在dgAttendance_ItemDataBound的时候进行dropdownlist的帮定的。
    private void dgAttendance_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.EditItem)
    {
    DropDownList ddl=(DropDownList)e.Item.FindControl("ddltype");
    ddl.DataSource=this.Gettypes ();
    ddl.DataTextField="name";
    ddl.DataValueField="value";
    ddl.DataBind();
    ddl.EnableViewState=true;
    //ddl.Items.FindByValue(Convert.ToString(
    // DataBinder.Eval(e.Item.DataItem,"value"))).Selected=true;
    }
    }
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    this.dgos.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgAttendance_EditCommand);
    this.dgos.CancelCommand  += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgAttendance_CancelCommand);
    this.dgos.UpdateCommand   += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgAttendance_UpdateCommand);
    this.dgos.ItemDataBound+=new System.Web.UI.WebControls.DataGridItemEventHandler(this.dgAttendance_ItemDataBound);
    this.cld .SelectionChanged += new EventHandler(this.Selection_Change);
    this.BindDb ();


    }
      

  10.   

    我觉得他好象是在发生update的时候,又被帮定了一边,所以,他又选成默认的第一个了。为什么会这样呢?
      

  11.   

    this.BindDb ();
    是绑定datagrid的吧
    ->
    if(!IsPostBack)
    {
    this.BindDb ();
    }
      

  12.   

    是啊。
    private void BindDb()
    {
    string Day=DateTime.Today .ToShortDateString ();
    if (this.cld .SelectedDate .ToShortDateString ()!="0001-1-1")
    {
    Day=this.cld.SelectedDate .ToShortDateString ();
    }
    this.dt=Attendance.GetDailylistall (Day);
    this.dgos .DataSource =this.dt ;
    this.dgos .DataBind ();

    }
      

  13.   

    在page-load时要怎么帮定dropdownlist呢,我是放在datagrid的edititem中的啊。
      

  14.   

    噢。天哪。好象是由于page-load,可是我还是很奇怪,我在这里又没有对dropdownlist进行帮定,怎么也会被赋值呢?