C# asp.net如何解析GridView?
asp.net如何解析GridView?假设我同时定义了EditItemTemplate和ItemTemplate。似乎我无法在加载时将任何数据绑定到EditItemTemplate中的dropdownlist之类的控件 当编辑模式激活时,数据是否会绑定到EditItemTemplate中的控件?如果没有,如何在C#中加载时绑定所有控件C# asp.net如何解析GridView?,c#,asp.net,gridview,C#,Asp.net,Gridview,asp.net如何解析GridView?假设我同时定义了EditItemTemplate和ItemTemplate。似乎我无法在加载时将任何数据绑定到EditItemTemplate中的dropdownlist之类的控件 当编辑模式激活时,数据是否会绑定到EditItemTemplate中的控件?如果没有,如何在C#中加载时绑定所有控件 谢谢,这真的快把我逼疯了。我找不到任何关于asp.net如何在线执行或评估GridView的信息。当GridView进入编辑模式时,您需要在处进行绑定。请记住,
谢谢,这真的快把我逼疯了。我找不到任何关于asp.net如何在线执行或评估GridView的信息。当GridView进入编辑模式时,您需要在处进行绑定。请记住,编辑控件只有在设置为特定行的编辑模式时才存在。此时可以绑定控件 通常,如果您有要在编辑模式下绑定的公共查找类型数据,我会在第一次需要时将其加载到
缓存
、会话
或视图状态
(取决于内容和情况),然后从该“缓存”位置绑定以保存DB调用。我通常为EditItemTemplate
中需要特殊绑定(如DropDownList
)的每个控件实现OnDataBinding
方法
在您的aspx中:
<EditItemTemplate>
<asp:DropDownList ID="yourDropDownList" runat="server"
OnDataBinding="yourDropDownList_DataBinding"></asp:DropDownList>
</EditItemTemplate>
我更喜欢用这种方式绑定,因为它会将代码本地化到特定的控件,而您不必使用FindControl
对行等进行查找
yourDropDownList\u数据绑定
仅在编辑模式下为该行触发。在初始绑定时,如果没有任何内容处于编辑模式,则数据绑定将不会启动,但每次将行置于编辑模式时,它都会执行,这就是为什么我说要以某种方式缓存第一次获取时要绑定到DropDownList
的数据。在将其置于编辑模式时需要进行绑定。请记住,编辑控件只有在设置为特定行的编辑模式时才存在。此时可以绑定控件
通常,如果您有要在编辑模式下绑定的公共查找类型数据,我会在第一次需要时将其加载到缓存
、会话
或视图状态
(取决于内容和情况),然后从该“缓存”位置绑定以保存DB调用。我通常为EditItemTemplate
中需要特殊绑定(如DropDownList
)的每个控件实现OnDataBinding
方法
在您的aspx中:
<EditItemTemplate>
<asp:DropDownList ID="yourDropDownList" runat="server"
OnDataBinding="yourDropDownList_DataBinding"></asp:DropDownList>
</EditItemTemplate>
我更喜欢用这种方式绑定,因为它会将代码本地化到特定的控件,而您不必使用FindControl
对行等进行查找
yourDropDownList\u数据绑定
仅在编辑模式下为该行触发。在初始绑定时,如果没有任何内容处于编辑模式,则不会触发数据绑定,但每次将行置于编辑模式时,数据绑定都会执行,这就是为什么我要说,在第一次获取数据时,以某种方式缓存要绑定到DropDownList的数据。尝试使用Eval设置网格,以从gridview的数据源获取数据
<asp:GridView ID="gv" runat="server" SkinID="gridviewSkin" AutoGenerateColumns="False" DataKeyNames="Id"
AutoGenerateEditButton="false"
OnRowEditing="GvItems_RowEditing"
OnRowCancelingEdit="GvItems_RowCancelingEdit"
OnRowUpdating="GvItems_RowUpdating"
OnPageIndexChanging="Gv_PageIndexChanging"
AllowPaging="true"
PageSize="20"
>
<Columns>
<asp:CommandField ShowEditButton="True" CausesValidation="true" />
<asp:TemplateField HeaderText="Name" ItemStyle-Width="200" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<%# Eval("Name")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtName" runat="server" Width="200" Text='<%# Eval("Name") %>' MaxLength="50" />
<asp:RequiredFieldValidator ID="rfv_txtName" runat="server" ControlToValidate="txtName" Display="Dynamic" ErrorMessage="(Required)" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Active" ItemStyle-Width="100" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkActive_Item" runat="server" Checked='<%# (bool)Eval("IsActive")%>' Enabled="false" />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chkActive_Edit" runat="server" Checked='<%# (bool)Eval("IsActive")%>' />
</EditItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>No items exist</EmptyDataTemplate>
</asp:GridView>
用于加载下拉数据源:
<asp:TemplateField HeaderText="Channel Type" ItemStyle-Width="200" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<%# Eval("ChannelType.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlChannelType" runat="server" DataSource="<%# GetChannelTypeDropdownBoxDataSource() %>" DataTextField="Name" DataValueField="Id" AppendDataBoundItems="true" SelectedValue='<%# Eval("ChannelId") %>' />
</EditItemTemplate>
</asp:TemplateField>
尝试使用Eval设置网格,以从gridview的数据源获取数据
<asp:GridView ID="gv" runat="server" SkinID="gridviewSkin" AutoGenerateColumns="False" DataKeyNames="Id"
AutoGenerateEditButton="false"
OnRowEditing="GvItems_RowEditing"
OnRowCancelingEdit="GvItems_RowCancelingEdit"
OnRowUpdating="GvItems_RowUpdating"
OnPageIndexChanging="Gv_PageIndexChanging"
AllowPaging="true"
PageSize="20"
>
<Columns>
<asp:CommandField ShowEditButton="True" CausesValidation="true" />
<asp:TemplateField HeaderText="Name" ItemStyle-Width="200" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<%# Eval("Name")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtName" runat="server" Width="200" Text='<%# Eval("Name") %>' MaxLength="50" />
<asp:RequiredFieldValidator ID="rfv_txtName" runat="server" ControlToValidate="txtName" Display="Dynamic" ErrorMessage="(Required)" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Active" ItemStyle-Width="100" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkActive_Item" runat="server" Checked='<%# (bool)Eval("IsActive")%>' Enabled="false" />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chkActive_Edit" runat="server" Checked='<%# (bool)Eval("IsActive")%>' />
</EditItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>No items exist</EmptyDataTemplate>
</asp:GridView>
用于加载下拉数据源:
<asp:TemplateField HeaderText="Channel Type" ItemStyle-Width="200" ItemStyle-VerticalAlign="Top">
<ItemTemplate>
<%# Eval("ChannelType.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlChannelType" runat="server" DataSource="<%# GetChannelTypeDropdownBoxDataSource() %>" DataTextField="Name" DataValueField="Id" AppendDataBoundItems="true" SelectedValue='<%# Eval("ChannelId") %>' />
</EditItemTemplate>
</asp:TemplateField>
GridView模板中有许多用于数据绑定嵌套控件的选项
最简单的,也是我可以使用的,就是使用一个,并将您的dropdownlist绑定到它
如果这不是一个选项,那么可以绑定RowDataBound事件。缺少,但是如果你按照这个例子(C#),它说:
// Display the company name in italics.
e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>";
由于EditItemTemplate和InsertItemTemplate不是同时呈现的,因此我通常在每个模板中保持控件名称相同,以简化代码中的数据绑定事件。但是,没有什么可以阻止您使用ddlEditItems
和ddlInsertItems
并在数据绑定事件中以不同方式绑定它们
我以前使用过的另一个技巧是使用下拉列表的OnInit事件绑定到DropDownList。例如:
// web form
<asp:DropDownList id="ddlWhatever" AutoPostBack="True"
runat="server" OnInit="ddlWhatever_Init">
// Code behind
protected void ddlWhatever_Init(object s, EventArgs a)
{
object[] years = {
new { Year = 2009 }, new { Year = 2010 }
};
ddlWhatever.DataSource = years;
ddlWhatever.DataTextField = "Year";
ddlWhatever.DataValueField = "Year";
ddlWhatever.DataBind();
}
//web表单
//代码隐藏
受保护的void ddlu Init(对象s、事件args a)
{
对象[]年={
新{Year=2009},新{Year=2010}
};
ddl.DataSource=年;
ddlvery.DataTextField=“年”;
ddlvaluefield=“年”;
ddl.DataBind();
}
有些人告诉我不要用最后一种方法(即控件不应该负责绑定本身)。我不同意,并且不记得在微软的框架设计指南中看到过任何与这一主张相关的东西。归根结底,当我不能使用ObjectDataSource时,我喜欢最后一种方式,但我也必须按照其他开发人员的接受程度编写代码D
我通常遵守的规则是:
在ObjectDataSource方便快捷的情况下使用它
当嵌套控件的项依赖于GridView中的其他值时,使用GridView行数据绑定
如果您只是绑定数据,请使用OnInit方法,请记住,当触发此方法时,您无法访问其他控件(例如,GridView可能尚未初始化)
我希望这能有所帮助,我也曾因MSDN缺少GridView示例而经历过类似的挫折 GridView模板中有许多用于数据绑定嵌套控件的选项
最简单的,也是我可以使用的,就是使用一个,并将您的dropdownlist绑定到它
如果这不是一个选项,那么可以绑定RowDataBound事件。缺少,但是如果你按照这个例子(C#),它说:
// Display the company name in italics.
e.Row.Cells[1].Text = "<i>" + e.Row.Cells[1].Text + "</i>";
由于EditItemTemplate和InsertItemTemplate不是同时呈现的,因此我通常在每个模板中保持控件名称相同,以简化代码中的数据绑定事件。但是,没有什么能阻止您拥有ddlEditItems
和ddlinserit