- PR -

javascriptでテキストボックスに日付を入れたい

1
投稿者投稿内容
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-05-15 13:08
度々、申し訳ありません。

先程、「ASP.NET チェックボックスの処理」でお世話になりました。

この中のチェックボックス「1」「2」「3」のいづれかにチェックが入っている場合、

GRIDVIEW内のテキストボックス「A」にチェックを入れた日付を取得したいです。

「ASP.NET チェックボックスの処理」の中で、

GridView内のコントロールを直接参照する事はできないと教わったので、

チェックボックスを参照する時と同じ様にコードを記入したのですが、

サーバ側コードで
「オブジェクト参照がオブジェクトインスタンスに設定されていません。」
というエラーになりました。

下記が入力したコードです。

サーバ側コード

Dim row As GridViewRow = e.Row
If row.RowType = DataControlRowType.DataRow Then
'オブジェクト取得
Dim box1 As CheckBox = row.FindControl("CheckBox1")
Dim box2 As CheckBox = row.FindControl("CheckBox2")
Dim box3 As CheckBox = row.FindControl("CheckBox3")
Dim box4 As CheckBox = row.FindControl("CheckBox4")
Dim box5 As TextBox = row.FindControl("TextBox16")

'IDをスクリプトに渡す
Dim script As String
script = "Change('{0}', '{1}', '{2}', '{3}', {4}, {5});"

'各ボックスにスクリプトを登録
box1.Attributes.Add("onclick", String.Format(script, box1.ClientID, box2.ClientID, box3.ClientID, box4.ClientID, box5.ClientID, 1))
box2.Attributes.Add("onclick", String.Format(script, box1.ClientID, box2.ClientID, box3.ClientID, box4.ClientID, box5.ClientID, 2))
box3.Attributes.Add("onclick", String.Format(script, box1.ClientID, box2.ClientID, box3.ClientID, box4.ClientID, box5.ClientID, 3))
box4.Attributes.Add("onclick", String.Format(script, box1.ClientID, box2.ClientID, box3.ClientID, box4.ClientID, box5.ClientID, 4))
box5.Attributes.Add("onclick", String.Format(script, box1.ClientID, box2.ClientID, box3.ClientID, box4.ClientID, box5.ClientID, 5))

End If


クライアント側コード

function Change(box1, box2, box3, box4, box5,no)

{
var chk1 = document.getElementById(box1);
var chk2 = document.getElementById(box2);
var chk3 = document.getElementById(box3);
var chk4 = document.getElementById(box4);
var chk5 = document.getElementById(box5);


switch (no)
{
case 1:
// チェックボックス切り替え
// ...
break;
case 2:
// チェックボックス切り替え
// 2番目がクリックされたので1番目もオンにする
{
chk1.checked = true;
chk3.checked = false;
chk4.checked = false;
break;
}
case 3:
// チェックボックス切り替え
// ...
{
chk1.checked = false;
chk2.checked = false;
chk4.checked = false;
break;
}
case 4:
// チェックボックス切り替え
// ...
{
chk1.checked = false;
chk2.checked = false;
chk3.checked = false;
break;
}
default:
break;

}

if ((chk2.checked == false) && (chk3.checked == false) && (chk4.checked == false))
{
chk1.checked = false;
}

if ((chk2.checked == true) || (chk3.checked == true) || (chk4.checked == true))
{
chk5.text = new date()
}

}

申し訳ございませんが、よろしくお願い致します。


まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2008-05-15 13:35
エラーが出ているのがサーバ側だったら、件名の「JavaScript」は関係ないのでは?

まず、どこでエラーが出ているのか切り分けるところからでしょう。
ここ↓ですか?
引用:

box1.Attributes.Add("onclick", String.Format(script, box1.ClientID, box2.ClientID, box3.ClientID, box4.ClientID, box5.ClientID, 1))


であれば、box5 が Nothing になっているからでは?
(以上であっているならば)じゃあ、なんで box5 が Nothing なんでしょうか?

というわけで、 FindControl について調べてみてはどうですか。
http://msdn.microsoft.com/ja-jp/library/486wc64h(VS.80).aspx

#回りくどく書いてますけど、教えてもらったコードを理解しないまま使うから、
#なにかあった時に自力で対処できないんだと思います。
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-05-15 14:27
クライアント側でも修正が必要ですね。

× script = "Change('{0}', '{1}', '{2}', '{3}', {4}, {5});"
○ script = "Change('{0}', '{1}', '{2}', '{3}', '{4}', {5});"

第5引数はテキストボックスのIDです。
なので、文字列として渡してやらなければクライアント側でエラーになります。
(第6引数は数値を渡す前提になっているのでこれで構わない)

---

× chk5.text = new date()
○ chk5.value = new date();

テキストボックスもクライアント側ではオブジェクトの仕様が
異なりますのでtextでは代入できません。

_________________
//---
 あやのこうじ@RapidExpress
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-05-15 16:38
まるく様、RapidExpress様 ありがとうございます。

サーバ側コード

「Dim box5 As TextBox = row.FindControl("TextBox16") 」を

「Dim box5 As control = row.FindControl("TextBox16") 」にして

RapidExpress様から頂いた修正部分を修正した所、

エラーはでなくなりましたが日付は取得できません。

「chk5.value="date";」という文字列扱いだと「date」と表示されます。
「chk5.value=123;」という数字扱いだと「123」と表示されます。

文字列や数字は表示されるのに、なぜ日付は表示されないのでしょうか? 


エラーが出なくなった時の変更箇所は上記の他に

ItemTemplateのIDをEditTemplateのIDと同じにしました。

Tempate使用時に自動的にIDがついたのですが、

こういう場合は手動で同じにしなければならないのでしょうか?

よろしくお願いします。

pitfall
会議室デビュー日: 2007/12/05
投稿数: 14
お住まい・勤務地: 東京都
投稿日時: 2008-05-15 18:11
new date() ⇒ new Date() とか?
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-05-16 02:01
ついでに、
コード:
Date.prototype.toString = function() {
   var s = "";
   s += this.getYear();
   s += "/";
   var a = this.getMonth()+1;
   s += (a < 10 ? "0" + a : a);
   a = this.getDate();
   s += (a < 10 ? "0" + a : a);
   return s;   
}


ってやってあげると、

xxx.value = new Date();

のとき、
xxx.value = "2008/05/16";

ってなります。
ぷり
ベテラン
会議室デビュー日: 2008/02/22
投稿数: 60
投稿日時: 2008-05-16 08:09
pitfall様、ぴあちゃん様 ありがとうございます。

pitfall様

ご指示の通り、「new Date()」すると表示されました。

ぴあちゃん様

ご記載頂いたコードを元に作成しました所、日付が表示され更新もできました。
(月日のみ表示させたかったのです。)


ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)