DataGrid中如何访问EditItemTemplate中的控件?

时间:2020-12-21 15:51:33
在从ItemTemplate状态向EditItemTemplate状态切换时,据我观察,这个时刻EditItemTemplate中的控件还未生成,这样我就没法根据数据库里的值给这个控件赋初值。这该怎么解决呢?请教高手。

11 个解决方案

#1


1. 设置DataGrid的EditItemIndex属性
2. 重新设置DataGrid的DataSource、执行DataGrid的DataBind方法
现在就可以使用EditItemTemplate里的控件了

#2


先对datagrid数据绑定,再访问

#3


先DataBind
访问用(CheckBox)datalist.Items[i].FindControl(checkBoxString)

#4


高手如云

#5


给其赋值应该在DataBound中:例子如下:

if(e.Item.ItemType==ListItemType.Item ||e.Item.ItemType==ListItemType.AlternatingItem)
{
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
{
Label label=new Label();
label=(Label)e.Item.Cells[5].FindControl("lbTime");
if(label.Text==""||label.Text==null)
label.Text="此处为空值";
}
}

#6


ctype(e.item.cells(0).controls(0),textbox).text
或者
dim t as textbox
t=e.item.findcontrol("textbox1")

#7


谢谢热心的朋友!不过大家可能还不太明白我的意思。我在点击DataGrid中的某一行的“编辑”按钮时,触发这个按钮的处理函数,在这个函数中设置EditItemIndex。但此时设置为编辑的那一行好像还是处于原来的浏览状态,也就是说EditItemTemplate中的控件还没生成,我事先绑定也没用,大家有什么好办法吗?

#8


在EditCommand事件处理函数中写
e.Item.ItemIndex = -1

#9


没那么麻烦吧!
在HTML里
<EditItemTemplate>
<asp:TextBox id=TextBox2 runat="server" Width="111px" Text="初值">
</asp:TextBox>
</EditItemTemplate>
也可以绑定数据或函数!!

#10


楼上各位说的都是TextBox的情况。不过我这里用的是DropDownList,需要根据数据库里的数值来动态设置DropDownList中的List的默认选定项,比如,List的备选项为“已完成”和“未完成”,数据库里的某字段为“已完成”,则进入编辑状态时默认的选项就为“已完成”。通常应该在程序里设置,但刚进入编辑状态时我根本找不到这个DropDownList空间呀。

#11


[C#]
xx.aspx

...
<asp:TemplateColumn SortExpression="depName" HeaderText="单位名称">
  <ItemTemplate>
    <asp:Label Runat=server Text='<%# DataBinder.Eval(Container.DataItem,"depName")%>' ID="Label2" />
  </ItemTemplate>
  <EditItemTemplate>
    <asp:TextBox Runat=server Columns=12 id="edit_depname" Text='<%# DataBinder.Eval(Container.DataItem,"depName")%>' />
  </EditItemTemplate>
</asp:TemplateColumn>

xx.aspx.cs

...
/// <summary>
/// 更新数据
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string cmd = "Update depart set depname= @dep_name where depid = @id";
SqlConnection conn = new SqlConnection(sql);
SqlCommand comm = new SqlCommand(cmd,conn);

// 新建参数
comm.Parameters.Add(new SqlParameter("@id",SqlDbType.NVarChar,20));
comm.Parameters.Add(new SqlParameter("@dep_name",SqlDbType.NVarChar,30));


// 给参数赋值
comm.Parameters["@id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
comm.Parameters["@dep_name"].Value = ((TextBox)e.Item.FindControl("edit_depname")).Text;


// 执行SQL语句
try
{
conn.Open();
comm.ExecuteNonQuery();
conn.Close();

DataGrid1.EditItemIndex = -1;
DataGridBind();
Label1.Text = "Succeed!";
}
catch(SqlException ex)
{
Label1.Text = "Error:"+ ex.Message;
}
 }

#1


1. 设置DataGrid的EditItemIndex属性
2. 重新设置DataGrid的DataSource、执行DataGrid的DataBind方法
现在就可以使用EditItemTemplate里的控件了

#2


先对datagrid数据绑定,再访问

#3


先DataBind
访问用(CheckBox)datalist.Items[i].FindControl(checkBoxString)

#4


高手如云

#5


给其赋值应该在DataBound中:例子如下:

if(e.Item.ItemType==ListItemType.Item ||e.Item.ItemType==ListItemType.AlternatingItem)
{
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
{
Label label=new Label();
label=(Label)e.Item.Cells[5].FindControl("lbTime");
if(label.Text==""||label.Text==null)
label.Text="此处为空值";
}
}

#6


ctype(e.item.cells(0).controls(0),textbox).text
或者
dim t as textbox
t=e.item.findcontrol("textbox1")

#7


谢谢热心的朋友!不过大家可能还不太明白我的意思。我在点击DataGrid中的某一行的“编辑”按钮时,触发这个按钮的处理函数,在这个函数中设置EditItemIndex。但此时设置为编辑的那一行好像还是处于原来的浏览状态,也就是说EditItemTemplate中的控件还没生成,我事先绑定也没用,大家有什么好办法吗?

#8


在EditCommand事件处理函数中写
e.Item.ItemIndex = -1

#9


没那么麻烦吧!
在HTML里
<EditItemTemplate>
<asp:TextBox id=TextBox2 runat="server" Width="111px" Text="初值">
</asp:TextBox>
</EditItemTemplate>
也可以绑定数据或函数!!

#10


楼上各位说的都是TextBox的情况。不过我这里用的是DropDownList,需要根据数据库里的数值来动态设置DropDownList中的List的默认选定项,比如,List的备选项为“已完成”和“未完成”,数据库里的某字段为“已完成”,则进入编辑状态时默认的选项就为“已完成”。通常应该在程序里设置,但刚进入编辑状态时我根本找不到这个DropDownList空间呀。

#11


[C#]
xx.aspx

...
<asp:TemplateColumn SortExpression="depName" HeaderText="单位名称">
  <ItemTemplate>
    <asp:Label Runat=server Text='<%# DataBinder.Eval(Container.DataItem,"depName")%>' ID="Label2" />
  </ItemTemplate>
  <EditItemTemplate>
    <asp:TextBox Runat=server Columns=12 id="edit_depname" Text='<%# DataBinder.Eval(Container.DataItem,"depName")%>' />
  </EditItemTemplate>
</asp:TemplateColumn>

xx.aspx.cs

...
/// <summary>
/// 更新数据
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>
private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string cmd = "Update depart set depname= @dep_name where depid = @id";
SqlConnection conn = new SqlConnection(sql);
SqlCommand comm = new SqlCommand(cmd,conn);

// 新建参数
comm.Parameters.Add(new SqlParameter("@id",SqlDbType.NVarChar,20));
comm.Parameters.Add(new SqlParameter("@dep_name",SqlDbType.NVarChar,30));


// 给参数赋值
comm.Parameters["@id"].Value = DataGrid1.DataKeys[(int)e.Item.ItemIndex];
comm.Parameters["@dep_name"].Value = ((TextBox)e.Item.FindControl("edit_depname")).Text;


// 执行SQL语句
try
{
conn.Open();
comm.ExecuteNonQuery();
conn.Close();

DataGrid1.EditItemIndex = -1;
DataGridBind();
Label1.Text = "Succeed!";
}
catch(SqlException ex)
{
Label1.Text = "Error:"+ ex.Message;
}
 }