BoundColumn col1=new BoundColumn();
for (int i=0;i<DGrid_jg.Items.Count;i++)
{
    col1=(BoundColumn)DGrid_jg.Items[i];
    col1.DataField="SightID";
}编译提示:无法将类型“System.Web.UI.WebControls.DataGridItem”转换为“System.Web.UI.WebControls.BoundColumn”如果把col1的col1=(BoundColumn)DGrid_jg.Items[i];放在循环外面写成col1=(BoundColumn)DGrid_jg.Items[1];编译就能通过,但结果没有赋值(循环已执行)

解决方案 »

  1.   

    改成:
    col1=(BoundColumn)DGrid_jg.Items[i].cell[0];
      

  2.   

    col1=(BoundColumn)DGrid_jg.Columns[i];
      

  3.   

    看你的意图,是想给某个DataGrid 里的 BoundColumn 的 DataField 赋值。BoundColumn col1=new BoundColumn();
    既然是 DataGrid 里已经有的 Column,为什么要再 new 一个呢??for (int i=0;i<DGrid_jg.Items.Count;i++)
    col1=(BoundColumn)DGrid_jg.Items[i];
    既然是对 Column 做处理,为什么取的确是 Item 呢?应该用 Columns。for (int i=0;i<DGrid_jg.Items.Count;i++)
    用了循环?你想对所有 BoundColumn 的所有 DataField 赋同样的值?
      

  4.   

    manbaum()真乃高人啊,一针见血我就是想给一个DataGrid 里的 BoundColumn 的 DataField 赋值。用了循环是因为其中还要对HyperLink的NavigateUrl属性赋值我现在按照你的说法去掉了new 语句,并改成了BoundColumn col1=(BoundColumn)DGrid_jg.Columns[0];
    编译通过,但似乎值没赋进去。
      

  5.   

    我把源码贴出来吧:CS:using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Configuration;//------------------------------------------------------------------------------------------------------//
    //    程序设计:陈丹
    //    最后修改:2004-10-20
    //    主要功能:含有图片字段的数据库维护列表,用于维护景观设计、资质证书。
    //------------------------------------------------------------------------------------------------------//namespace WebAppZHLY.admin
    {
    /// <summary>
    /// jgwh 的摘要说明。
    /// </summary>
    public class jgwh : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button Btn_delall;
    protected System.Web.UI.WebControls.CheckBox CheckBox_selall;
    protected System.Web.UI.WebControls.DataGrid DGrid_jg;

    private void Page_Load(object sender, System.EventArgs e)
    {
    if (! Page.IsPostBack)
    {
    string tablename="";
    Session["nowpage"]=Request.QueryString["formpg"];
    string page=Session["nowpage"].ToString(); // BoundColumn col1=new BoundColumn();
    HyperLink col2=new HyperLink(); if (page=="jgwh") //景观设计
    {
    tablename="Sight";
    }
    else if (page=="zswh") //资质证书维护
    {
    tablename="aptitude";
    } DGrid_jg.AlternatingItemStyle.BackColor=Color.White;
    string connstr=(string)ConfigurationSettings.AppSettings["connstr"];
    SqlConnection conn=new SqlConnection(connstr);
    conn.Open(); SqlCommand cmd=new SqlCommand("sel_all",conn);
    cmd.CommandType=CommandType.StoredProcedure;
    cmd.Parameters.Add("@Tablename",SqlDbType.VarChar);
    cmd.Parameters.Add("@wherestr",SqlDbType.VarChar);
    cmd.Parameters["@Tablename"].Value=tablename;
    cmd.Parameters["@wherestr"].Value=""; DGrid_jg.DataSource=cmd.ExecuteReader();
    DGrid_jg.DataBind(); cmd.Connection.Close();
    cmd.Connection.Open(); SqlDataReader reader=cmd.ExecuteReader(); for (int i=0;i<DGrid_jg.Items.Count;i++)
    {
    BoundColumn col1=(BoundColumn)DGrid_jg.Columns[1];
    col2=(HyperLink)DGrid_jg.Items[i].FindControl("HLink1"); reader.Read();
    if (page=="jgwh") //景观设计
    {
    col1.DataField="SightID";
    col2.NavigateUrl="edit_jg.aspx?id="+reader["SightID"]+"&picname="+reader["Sig_name"];
    col2.Text=reader["Sig_name"].ToString();
    }
    else if (page=="zswh") //资质证书维护
    {
    col1.DataField="AptitudeID";
    col2.NavigateUrl="edit_jg.aspx?id="+reader["AptitudeID"]+"&picname="+reader["Aname"];
    col2.Text=reader["Aname"].ToString();
    }
    }
    } } #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }
    aspx:……
    <FONT face="宋体">
    <asp:datagrid id="DGrid_jg" runat="server" AutoGenerateColumns="False" Width="102%" ItemStyle-CssClass="DGrid_admin_I" HeaderStyle-CssClass="DGrid_admin_H">
    <Columns>
    <asp:TemplateColumn HeaderText="选择" ItemStyle-HorizontalAlign="Center">
    <ItemTemplate>
    <asp:CheckBox ID="sel" Runat="server" />
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:BoundColumn DataField="" HeaderText="编号" ItemStyle-HorizontalAlign="Center" />
    <asp:TemplateColumn HeaderText="景观名称">
    <ItemTemplate>
    <asp:HyperLink ID="HLink1" Runat="server" NavigateUrl=''></asp:HyperLink>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    </asp:datagrid></FONT>
    ……
      

  6.   

    用了循环是因为其中还要对HyperLink的NavigateUrl属性赋值
    BoundColumn col1=(BoundColumn)
    ---
    如果既有 BoundColumn 又有 HyperLinkColumn,那你做强制转换岂不是会抛 InvalidCastException??我现在按照你的说法去掉了new 语句,并改成了BoundColumn col1=(BoundColumn)DGrid_jg.Columns[0];
    编译通过,但似乎值没赋进去。
    ---
    如果如前所述,抛异常了,当然赋不进。
    如果没抛异常,那么就是你这段代码执行的位置不对,或者说是你放置的位置不对。
      

  7.   

    5555555555555555
    manbaum() 救命啊………………分不够再加啊
      

  8.   

    晕啊。
    你的这些赋值操作不会写到Datagrid_ItemDataBound事件里面吗?
      

  9.   

    DataField属性可以在设计器中指定以你的数据源是dataset为例,以编程的方式修改datagrid中的数据:
    foreach(DataRow next in ds.Tables[0].Rows)
    {
       next[index]=你想要的值;
    }
    或者在datagrid的ItemDataBound()事件中
    datagrid_ItemDataBound(...)
    {
       if(e.Item.ItemType==ListItemType.Item || ....)
       {
           e.Item.Cells[index].Text="你想要的值";
       }
    }
      

  10.   

    建议:1、在页面里放两个 DataGrid,一个显示景观设计,一个显示资质证书。根据 page 的值来设置 DataGrid.Visible 属性。2、“编号”列可以直接设置好 DataField,因为是两个 DataGrid,所以可以分开了。3、“景观名称”列需要在 DataGrid.ItemDataBound 事件里处理。我以景观设计举例,另一个类似,你自己写:
    switch (e.Item.ItemType)
    {
      case ListItemType.Item:
      case ListItemType.AlternationItem:
      case ListItemType.SelectedItem:
        string SightID = (string)DataBinder.Eval(e.Item, "DataItem.SightID");
        string Sig_name = (string)DataBinder.Eval(e.Item, "DataItem.Sig_name");
        HyperLink c = (HyperLink)e.Item.FindControl("HLink1");
        c.NavigateUrl = string.Format("edit_jg.aspx?id={0}&picname={1}", SightID, Sig_name);
        break;
    }
      

  11.   

    xiaohutushen(xiaohutushen) :) 因为URL要同时传递两个参数id和picname,而且url又要动态改动,所以就这好这样写了。
    如果你有更好的写法,告诉我,我另外给分(50)。manbaum() :
    找到原因了,的确是位置没放对,现在把
    BoundColumn col1=(BoundColumn)DGrid_jg.Columns[1];
    col1.DataField="SightID";
    两句放到了绑定前就对了,思路性错误,呵,结贴了
      

  12.   

    还有。你对 DataGrid 的数据绑定理解不对!你应该在得到 DataReader 后将其赋给 DataGrid.DataSource,然后调用 DataGrid.DataBind()。不用你用循环去对每行数据进行赋值。
      

  13.   

    谢谢manbaum,这个贴的分太少,我就分给另外几位了
    你到这里接分
    http://community.csdn.net/Expert/topic/3478/3478571.xml?temp=.2016565