我知道这似乎是一个重复的问题,但我真的无法找到相关主题的好答案.
关于什么是处理OnClick事件的最佳方式,有很多问题Button.
以下是我遇到的一些选项:
OnCreate方式定义侦听器:button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//do stuff
}
});
Run Code Online (Sandbox Code Playgroud)
android:OnClick在XML上设置属性:<Button android:id="@+id/btnDelete"
...
android:OnClick="btnDelete_OnClick"/>
Run Code Online (Sandbox Code Playgroud)
OnClickListener在Activity类上实现接口并将自引用传递给Button:public class MainActivity extends Activity implements OnClickListener{
@Override
public void onClick(View v) {
//do stuff
}
protected void onCreate(Bundle savedInstanceState) {
...
button.setOnClickListener(this);
}
}
Run Code Online (Sandbox Code Playgroud)
OnClickListener类型为的字段:private OnClickListener onClickHandler = new OnClickListener(){
@Override
public void onClick(View v) { …Run Code Online (Sandbox Code Playgroud) 语境:
我经常遇到这样的情况:我们的ASP.NET页面必须在GridView上向用户显示数据,让他随心所欲地更改它(单元格上的文本框),并且只有当他实际点击时才将其保存到数据库中.保存按钮".此数据通常是页面上信息的虚拟状态,这意味着用户可以更改所有内容,而无需保存,直到他点击"保存按钮".在这些情况下,总是需要在ASP.NET回发中保留数据列表.这些数据可以是一个DataTable或只是一些的实例List<Someclass>.
我经常看到人们实现这一点并持久保存数据Session.在这种情况下,我通常也会看到一些用户导航时打开多个标签的问题,有些时候在同一页面上.两个不同选项卡的数据将合并在一起,导致信息被扰乱的问题.
如何经常使用Session的示例:
private List<SomeClass> DataList
{
get
{
return Session["SomeKey"] as List<SomeClass>;
}
set
{
Session["SomeKey"] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
人们经常试图通过做这样的事情来解决它:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList = null
}
else
{
FillGridView(DataList);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当两个标签已经加载并且用户正在更改GridView值时,出于某种奇怪的原因,他试图通过点击另一页上的"保存"按钮来保存数据呢?我个人不喜欢这个选项.
其他方法是将数据放在上面ViewState.但是,当涉及到持久存在的大型列表时,它可能会在页面存储时严重影响页面(HiddenField).
但是,这项工作的最佳方式是什么?有一次,我想Session与ViewState在哪里一起使用ViewState将保存一个唯一的标识符来索引Session保存的数据.这样可以防止在浏览器上的标签之间共享数据:
private List<SomeClass> DataList
{
get
{
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
return Session[ViewState["SomeKey"].ToString()] …Run Code Online (Sandbox Code Playgroud) 请考虑以下HTML:
<html>
<head></head>
<body>
<input type="text" onblur="window.setTimeout('document.title += 2;', 0);" />
<input type="button" onclick="document.title += 1" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
并执行以下步骤:
现在,事件将按以下顺序发生:
在我得到的所有可访问的浏览器上测试:
document.title = '21' //Expected behavior
Run Code Online (Sandbox Code Playgroud)
但!在生产浏览器(Windows XP + IE 7)上,我得到:
document.title = '12' //Unexpected behavior
Run Code Online (Sandbox Code Playgroud)
我也尝试在我的本地机器(IE 10)上以IE 7模式模拟它,无法重现它.
这显然是我遇到的问题的简化示例.否则我可以简单地摆脱setTimeout.
在实际场景中,setTimeout调用实际上是由第三方脚本库(ASP.NET Dev Express组件)进行的.
除了这个问题的实际解决方案(我认为我可以处理),可以对这种行为应用什么解释?
更新:
使用表达式new Date().getTime()获取浏览器执行的每个步骤的时间.它发生如下:
1387369361417 //document.title += 1
1387369361433 //document.title += 2
Run Code Online (Sandbox Code Playgroud) 样本数据:
product_type |segment_type |promotion_id |promotion_value
-----------------------------------------------------------
Beer |Regional |1 |20
Beer |National |1 |20
Beer |Regional |2 |20
Beer |National |2 |20
Beer |National |3 |30
Beer |Regional |4 |40
Soda |Regional |5 |50
Soda |National |5 |50
Soda |Regional |6 |50
Soda |National |6 |50
Soda |National |7 |15
Soda |Regional |8 |20
Run Code Online (Sandbox Code Playgroud)
目标:获取按product_type和segment_type(多维数据集)分组的总促销价值,考虑不同的促销活动.请注意,单个促销可以到达一个或两个细分(区域和国家).
期望的结果:
product_type |segment_type |promotion_value
-------------------------------------------------
Beer | |110
Beer |Regional |80
Beer |National |70
Soda | |135
Soda |Regional |120
Soda |National |115
Run Code Online (Sandbox Code Playgroud)
我目前的SQL如下: …
我正在尝试使用我在开发Web应用程序时可以考虑的最强大的OOP,但是在使用代码创建事件处理程序时,我遇到了问题.我确信这是一个相当简单的解决方案,我不断放弃,但我不知道下一步该尝试什么.下面是我一直在玩的一些测试代码,只是想按下按钮去做一些事情.
(想象一下,"int i"这一行有一个断点)
Button b = new Button();
b.Text = "Do Something";
b.Attributes.Add("runat", "server");
b.Attributes.Add("OnClick", "click");
form1.Controls.Add(b);
private void click(object sender, EventArgs e)
{
int i;
}
Run Code Online (Sandbox Code Playgroud)
由于这是我的Page_Load创建的一个新按钮,我不能只是对XHTML进行硬编码.调试永远不会到达我的断点.CheckBoxes也没有取得任何成功.