获取下拉列表值时避免回发 c# asp
Avoid postback when getting dropdownlist value c# asp
我在 C# 中动态创建了一个 dropdownlist
(asp 中没有代码):
DropDownList myDDL = new DropDownList();
无法从 pageLoad()
调用它,因为它不会在每次页面刷新时加载。但是它每次加载另一个 dll 的 OnPostback(OnSelectedIndexChanged()
) 所以我不能做 !IsPostBack
.
此 dll 创建时间:
另一个 dropdownlist
的值使用 OnSelectedIndexChanged()
填充 GridView
<asp:DropDownList id ="select1" name="assignGetForm" runat="server" class="selectClass" AutoPostBack="True" OnSelectedIndexChanged="populateGridView">
在GridView
上一个函数是运行OnRowDatabound()
(当上面的OnIndexChanged()
填充它时)填充myDDL 里面的GridView
<asp:GridView id="GridView1" name="GridView1" onrowdatabound="populateCellsDDL" runat="server"></asp:GridView>
我现在正在尝试使用按钮 onclick()
事件访问 myDDL
中的值 - 但是这总是会回发并刷新页面,因此 myDDL
消失并且当我打印时console 的值只给出了我的第一个值 select activity
而不是我实际选择的值。
由于此 dll 未在 pageLoad()
上填充,因此更改后我将如何获取这些值。
我试过查看 AJAX 但是我不确定如何通过它查看 c# 值。我也试过 viewstates
但我没有运气,因为它没有在 pageLoad()
.
上填充
我认为,如果您想访问动态创建的控件的值,则需要在每次回传中重新绑定网格。
我尝试用下面的示例代码模拟这种情况,我能够成功访问该值。
ASPX代码
<asp:DropDownList ID="select1" name="assignGetForm" runat="server" class="selectClass" AutoPostBack="True" />
<asp:GridView ID="GridView1" name="GridView1" OnRowDataBound="GridView1_DataBound" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
C# 代码隐藏
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
FillMainDll();
if (!IsPostBack || GridView1.Rows.Count > 0)
BindGrid();
}
private void FillMainDll()
{
select1.DataSource = new int[] { 1, 2, 3 };
select1.DataBind();
}
private void BindGrid()
{
var dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
for (int i = 1; i < 5; i++)
{
DataRow dr = dt.NewRow();
dr[0] = i;
dr[1] = "Name - " + i.ToString();
dt.Rows.Add(dr);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_DataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var myDDL = new DropDownList();
myDDL.ID = "myDDL";
myDDL.DataSource = GetGridRowDdlData();
myDDL.DataBind();
e.Row.Cells[1].Controls.Add(myDDL);
}
}
private IEnumerable<string> GetGridRowDdlData()
{
var data = new List<string>();
for (int i = 1; i < 4; i++)
{
data.Add("Name - " + i * int.Parse(select1.SelectedValue));
}
return data;
}
protected void Button1_Click(object sender, EventArgs e)
{
var sb = new System.Text.StringBuilder();
foreach (GridViewRow row in GridView1.Rows)
{
var myDDL = row.FindControl("myDDL") as DropDownList;
if (myDDL != null)
{
sb.AppendFormat("{0}<br/>", myDDL.SelectedValue);
}
}
Response.Write(sb.ToString());
}
我在 C# 中动态创建了一个 dropdownlist
(asp 中没有代码):
DropDownList myDDL = new DropDownList();
无法从 pageLoad()
调用它,因为它不会在每次页面刷新时加载。但是它每次加载另一个 dll 的 OnPostback(OnSelectedIndexChanged()
) 所以我不能做 !IsPostBack
.
此 dll 创建时间:
另一个
填充dropdownlist
的值使用OnSelectedIndexChanged()
GridView
<asp:DropDownList id ="select1" name="assignGetForm" runat="server" class="selectClass" AutoPostBack="True" OnSelectedIndexChanged="populateGridView">
在
GridView
上一个函数是运行OnRowDatabound()
(当上面的OnIndexChanged()
填充它时)填充myDDL 里面的GridView
<asp:GridView id="GridView1" name="GridView1" onrowdatabound="populateCellsDDL" runat="server"></asp:GridView>
我现在正在尝试使用按钮 onclick()
事件访问 myDDL
中的值 - 但是这总是会回发并刷新页面,因此 myDDL
消失并且当我打印时console 的值只给出了我的第一个值 select activity
而不是我实际选择的值。
由于此 dll 未在 pageLoad()
上填充,因此更改后我将如何获取这些值。
我试过查看 AJAX 但是我不确定如何通过它查看 c# 值。我也试过 viewstates
但我没有运气,因为它没有在 pageLoad()
.
我认为,如果您想访问动态创建的控件的值,则需要在每次回传中重新绑定网格。
我尝试用下面的示例代码模拟这种情况,我能够成功访问该值。
ASPX代码
<asp:DropDownList ID="select1" name="assignGetForm" runat="server" class="selectClass" AutoPostBack="True" />
<asp:GridView ID="GridView1" name="GridView1" OnRowDataBound="GridView1_DataBound" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
C# 代码隐藏
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
FillMainDll();
if (!IsPostBack || GridView1.Rows.Count > 0)
BindGrid();
}
private void FillMainDll()
{
select1.DataSource = new int[] { 1, 2, 3 };
select1.DataBind();
}
private void BindGrid()
{
var dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
for (int i = 1; i < 5; i++)
{
DataRow dr = dt.NewRow();
dr[0] = i;
dr[1] = "Name - " + i.ToString();
dt.Rows.Add(dr);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_DataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var myDDL = new DropDownList();
myDDL.ID = "myDDL";
myDDL.DataSource = GetGridRowDdlData();
myDDL.DataBind();
e.Row.Cells[1].Controls.Add(myDDL);
}
}
private IEnumerable<string> GetGridRowDdlData()
{
var data = new List<string>();
for (int i = 1; i < 4; i++)
{
data.Add("Name - " + i * int.Parse(select1.SelectedValue));
}
return data;
}
protected void Button1_Click(object sender, EventArgs e)
{
var sb = new System.Text.StringBuilder();
foreach (GridViewRow row in GridView1.Rows)
{
var myDDL = row.FindControl("myDDL") as DropDownList;
if (myDDL != null)
{
sb.AppendFormat("{0}<br/>", myDDL.SelectedValue);
}
}
Response.Write(sb.ToString());
}