Profil för huluminmin热爱生活FotonBloggListor Verktyg Hjälp

huluminmin

Foto 1 av 101
Fler album (1)
den 17 juni

动态控件的位置问题

kaixin11002005-7-18 14:59:07(skytear)2005-7-18 15:00:22
用一个Panel来定位
Button btn = new Button();
btn.Text = "hello";
Panel1.Controls.Add(btn);
回复人:混分的(yeskele)2005-7-18 15:15:00
 
也可以用table.rows(i).cell(j).innerhtml=""
引號裏是htnml代碼。
回复人:一瓢 在路上...(bitsbird)2005-7-18 15:26:08
 
TextBox tb =new TextBox();
tb.ID="TextBox1";
tb.AutoPostBack=true;
tb.Attributes.Add("style","Z-INDEX: 104; LEFT: 144px; POSITION: absolute; TOP: 448px");
tb.TextChanged+=new EventHandler(textBoxChange);
this.Controls[1].Controls.Add(tb);
回复人:看了七八个顶尖的web工作流。(sp1234)2005-7-18 15:50:32
 
是的,controls.add,tablerow.rows.add等等。
回复人:一天(dapanda)2005-7-18 15:57:24
 
如果是增加服务器控间,保存其状态不丢失,是相当麻烦的,
下面是我以前保存的代码,我参考了后,做出来了,有什么问题可以问我。
对于你的这个问题,我的解决方案是(没有办法实地测试,只能是根据你的描述和需求分析和拍脑袋解决了):

把你动态生成控件的代码写到一个过程中:

private void CreateDynamicControls()//具体需要传递什么的参数及返回什么样的值自己考虑了。
{
}


在这个过程中进行一个简单的处理:

1——
清除容器(父)控件中所有通过本方法动态生成的子控件
比如:PH1.Controls.Clear();

2——
生成需要的所有控件

3——
把这些控件通过Controls.Add添加到指定的容器(父)控件中(比如PH1.Controls.Add(ov))


这样你就模块化的实现了所需要控件的动态生成的过程,接下来就是你根据需要动态调用这个函数的问题了。


首先,这个方法应该在OnInit函数中调用,这样可以确保动态生成的控件在PostBack的时候仍然在页面中存在(系统还没有智能到这个地步,是不会自动生成的),否则,系统将在POSTBACK的时候不能获得动态生成的控件,导致数据丢失。

其次,在你的代码处理过程(事件处理过程)中,根据需要适当的调用这个函数,实现具体内容的动态修改。


这里要注意的几个问题:

1——
既然控件是动态生成的,那么第一次启动页面(IsPostBack为false时)页面中实际上是不存在动态生成的控件的,这个时候,要对在OnInit中对CreateDynamicControls的调用进行判断:

if(Request.Form["__VIEWSTATE"]!=null)
{
//这里根据需要初始化并调用方法CreateDynamicControls
}

2——
在OnInit中调用函数CreateDynamicControls动态创建控件时,所创建的控件数量的控制以及其数据来源的问题。
这个问题的解决,可以采用ViewState来保存相关的数据信息:

假设,你动态生成控件时,是用户切换了分页、用户改变了搜索条件导致的,那么需要把当前的页码信息和搜索条件等信息保存到VIEWSTATE中,这样可以保证在OnInit中调用CreateDynamicControls函数时使用了相同的数据信息,从而保证PAGE在POSTBACK时动态生成控件的正确恢复。
在这个解决中,VIEWSTATE中的数据是晚于OnInit生成的,也就是说调用OnInit时,VIEWSTATE中还没有把数据有效的生成,因此保存到VIEWSTATE中是不可取的,这里可以采取迂回的解决方案:以前写ASP时的方法:

A——
定义一个HIDDEN类型的INPUT,设置RUNAT=SERVER,ID为HIDDENTEXT(假设这个ID)

B——
在事件PreRender中,实现上面数据信息(如页码、搜索条件等)进行处理后保存到HIDDEN域中:
HIDDENTEXT.Value=...

C——
在OnInit中:
if(Request.Form["__VIEWSTATE"]!=null)
{
string strHiddenText=Request.Form[HIDDENTEXT.UniqueID];
//这里分析strHiddenText,把相关信息回复到对应的变量中
//这里根据需要初始化并调用方法CreateDynamicControls
}


在这个解决数据信息的方案中,存在一个问题,就是数据库的信息可能随时都在变,虽然有页码信息和搜索条件信息,但当PAGE POSTBACK的时候,按照这些条件获取的数据并不是原来的数据(因为数据在变呀!),怎么办?

解决:

a——
动态生成控件时用到的数据序列化后保存到上面的HIDDENTEXT中,在OnInit中在获取了HIDDENTEXT的数据后再进行反序列化获得数据。
这个方法有个麻烦:数据量大时,页面往返传输大量的数据浪费大量的带宽资源

b——
针对a中的解决方案带宽资源浪费大的问题,这里采取新的解决方案:使用CACHE来存取动态控件用到的数据
Cache["DynamicControlsDataSet"]=ds;//动态数据的数据集DataSet,具体自己确定
这样在OnInit中:
if(Request.Form["__VIEWSTATE"]!=null)
{
DataSet ds=(DataSet)Cache["DynamicControlsDataSet"];
//这里分析strHiddenText,把相关信息回复到对应的变量中
//这里根据需要初始化并调用方法CreateDynamicControls
}
这里还存在的一个问题是:Cache是共享使用的,会导致数据的干扰!解决:使用GUID来处理:

::定义变量
private string m_strGuid;

::保存数据
在PreRender事件处理中:
if(m_strGuid==null)
{
m_strGuid=System.Guid.NewGuid().ToString();
}
Cache[m_strGuid]=ds;
HIDDENTEXT.Value=m_strGuid;

在OnInit中:
if(Request.Form["__VIEWSTATE"]!=null)
{
m_strGuid=Request.Form[HIDDENTEXT.UniqueID];
DataSet ds=(DataSet)Cache[m_strGuid];
//这里分析strHiddenText,把相关信息回复到对应的变量中
//这里根据需要初始化并调用方法CreateDynamicControls
}

目录

计算机方面的东西欢迎大家来交流,这里主要是网页设计的比较多因为我做的毕业设计就是网页方面的呵呵。

滚动文本的实现
用户控件的使用
Repeater的使用
SQL Server不存在或拒绝访问的原因
C#电梯小程序(一)
C#电梯小程序(二)
关于DBNULL的问题
从我男朋友那看到的笑话,建议男生和好色女进去看看,如果大家都不看我就留着将来用来给我儿子做启蒙教育了。

笑话
男生舍不得删掉的手机短信

我的生活,一些我的东西有点乱,也没时间整理!


我的生活(入党的时候写的自传,想入党的可以参考一下,仅供参考^_^!)

感想(写要进入军队的心情)

规律的生活和充足的睡眠(要好好照顾自己,注意睡眠,别等老了才后悔。)
爱美mm来看看(丰胸和长长睫毛的我从网上收集的不知有效不)
感人的故事(又很多故事让我流泪)


一些杂七杂八的东西不过也许大家用的到,分享一下!

职业的成功(选修课论文)

DBNULL

      今天又遇到一个问题。字符串类型的数据不能和DBNULL做比较。要判断是否为DBNULL正确的方法应该是 text.tostring<>DBNULL.哈。我还收集了一些资料哈!
      DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

在 IDbCommand(OleDbCommand,SqlCommand...) 的ExecuteScalar的返回值中,情况可以这样分析:

select 1 这样返回的object是 1
select null 这样返回的是DBNull.Value
select isnull(null,1) 返回的是 1
select top 0 id from table1 这样返回的值是null
select isnull(id,0) from table1 where 1=0 返回的值是null

这里 ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果一行都没有,那么ExecuteScalar就返回null

规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:

string username=cmd.ExecuteScalar().ToString();

除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

又或者 select id from usertable where username=@name 这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要

int userid=Convert.ToInt32(cmd.ExecuteScalar());

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where username=@name

但是 int userid=Convert.ToInt32(cmd.ExecuteScalar()); 依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为DBNull.Value,则代表SQL中的NULL

所以,如果你要调用存储过程,里面有参数 @val nvarchar(20)="AABB" ,
那么cmd.Parameters["@val"].Value=null 代表使用这个默认的 "AABB"
而cmd.Parameters["@val"].Value=DBNull.Value 代表使用NULL来传给 @val


你可以用Convert.IsDBNull来判断一个值是否DBNull。注意Convert.IsDBNull(null)是false。


备注:以上的SQL语句全是指SQLSERVER2000的。其他的数据库是否为同样的行为,我不确定。
VB.NET的变化之一是将VB6中能用的IsNull和IsEmpty函数删除了,而提供另一种方式来确定变量是否被初始化,即IsDBNull()方法.

IsDBNull()方法接受一个对象作为它的参数,并返回一个布尔值指示变量是否被初始化.

Dim strMyName as String

if Not isDBNull(strMyName) Then

  strMyName="Initialize my string"

end if

  

除此之外,VB.NET还提供了DBNull类,它是System名称空间的一部分.其使用方法是:先声明一个DBNull类型的变量,然后,这个变量被用于Is比较运算符,以确定给定的变量是否被初始化.

Dim sysNull as System.DBNull

Dim strMyName as String

if strMyName is sysNull Then

  strMyName="Initialize my string"

end if
 
den 13 juni

四六级单词冲刺

1) quite 相当 quiet 安静地

2) affect v 影响, 假装 effect n 结果, 影响

3) adapt 适应 adopt 采用 adept 内行

4) angel 天使 angle 角度

5) dairy 牛奶厂 diary 日记

6) contend 奋斗, 斗争 content 内容, 满足的 context 上下文 contest 竞争, 比赛

7) principal 校长, 主要的 principle 原则

8) implicit 含蓄的 explicit 明白的

9) dessert 甜食 desert 沙漠 v 放弃 dissert 写论文

10) pat 轻拍 tap 轻打 slap 掌击 rap 敲,打

11) decent 正经的 descent n 向下, 血统 descend v 向下

12) sweet 甜的 sweat 汗水

13) later 后来 latter 后者 latest 最近的 lately adv 最近

14) costume 服装 custom 习惯

15) extensive 广泛的 intensive 深刻的

16) aural 耳的 oral 口头的

17) abroad 国外 aboard 上(船,飞机)

18) altar 祭坛 alter 改变

19) assent 同意 ascent 上升 accent 口音

20) champion 冠军 champagne 香槟酒 campaign 战役

21) baron 男爵 barren 不毛之地的 barn 古仓

22) beam 梁, 光束 bean 豆 been have 过去式

23) precede 领先 proceed 进行,继续

24) pray 祈祷 prey 猎物

25) chicken 鸡 kitchen 厨房

26) monkey 猴子 donkey 驴

27) chore 家务活 chord 和弦 cord 细绳

28) cite 引用 site 场所 sight 视觉

29) clash (金属)幢击声 crash 碰幢,坠落 crush 压坏

30) compliment 赞美 complement 附加物

31) confirm 确认 conform 使顺从

32) contact 接触 contract 合同 contrast 对照

33) council 议会 counsel 忠告 consul 领事

34) crow 乌鸦 crown 王冠 clown 小丑 cow 牛

35) dose 一剂药 doze 打盹

36) drawn draw 过去分词 drown 溺水

37) emigrant 移民到国外 immigrant 从某国来的移民

38) excess n 超过 exceed v超过 excel 擅长

39) hotel 青年旅社 hostel 旅店

40) latitude 纬度 altitude 高度 gratitude 感激

41) immoral 不道德 的 immortal 不朽的

42) lone 孤独的 alone 单独的 lonely 寂寞的

43) mortal 不死的 metal 金属 mental 神经的 medal 勋章 model 模特meddle 玩弄

44) scare 惊吓 scarce 缺乏的

45) drought 天旱 draught 通风, 拖 拉 draughts (英)国际跳棋

47) assure 保证 ensure 使确定 insure 保险

48) except 除外 expect 期望 accept 接受 excerpt 选录 exempt 免除

49) floor 地板 flour 面粉

50) incident 事件 accident 意外

51) inspiration 灵感 aspiration 渴望

52) march 三月, 前进 match 比赛

53) patent 专利 potent 有力的 potential 潜在的

54) police 警察 policy 政策 politics 政治

55) protest 抗议 protect 保护

56) require 需要 inquire 询问 enquire 询问 acquire 获得

67) revenge 报仇 avenge 为...报仇

68) story 故事 storey 楼层 store 商店

69) strike 打 stick 坚持 strict 严格的

70) expand 扩张 expend 花费 extend 延长

71) commerce 商业 commence 开始

72) through 通过 thorough 彻底的 (al)though 尽管 thought think 过去分词

73) purpose 目的 suppose 假设 propose 建议

74) expect 期望 respect 尊敬 aspect 方面 inspect 视察 suspect 怀疑

75) glide 滑翔 slide 使滑行 slip 跌落

76) steal 偷 steel 钢

77) strive 努力 stride 大步走

78) allusion 暗示 illusion 幻觉 delusion 错觉 elusion 逃避

79) prospect 前景 perspective 透视法

80) stationery 文具 stationary 固定的

81) loose 松的 lose 丢失 loss n 损失 lost lose过去式

82) amend 改正, 修正 emend 校正

83) amoral unmoral immoral 同义 不道德的

den 12 juni

制作网页时实现滚动文本

滚动文本的实现。为了能使网页更活泼,我们必须增加一些引人注意的部分。其中滚动文本就是一种比较好的方法。设置滚动文本的方法是在网页中加入如下标记:

<marquee direction=[up|left|right|down]>

滚动的文本或控件

</marquee>

direction是用来设置文本的滚动方向的up:从下向上滚动;down:从上向下滚动;left:从右向左滚动;right:从左向右滚动。但有的时候我们不希望它总是滚动的而是当鼠标在文字上的时候我们就希望文本不在滚动,当鼠标离开的时候文本再接着滚动,这时候就要在<marquee>标记里加入onmouseover=stop() onmouseout=start(),这时就实现了上述的效果。在有的时候<marqudee></marquee>之间不是文本而是控件了,这就是需要探索的了,因为不是所有的控件都能放在<marqudee></marquee>之间,会出现错误或者出现意想不到的效果,有时在不能显示效果的控件外部加上<table>就又可以实现效果了。所以这是需要在实践中体会的。下一页