2010-04-14 4 views
1

이 예외를 어떻게 해결할 수 있습니까? 여기 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. (NullreferenceException이 사용자 코드에 의해 처리되지 않았습니다.)

<asp:Repeater ID="DownloadsRepeater" runat="server"> 

<HeaderTemplate> 
<table width="70%"> 
<tr> 
<td colspan="3"><h2>Files you can download</h2></td> 
</tr> 
</HeaderTemplate> 

<ItemTemplate> 
<tr> 
<td width="5%"> 
<asp:Literal ID="imagepathlit" runat="server"></asp:Literal></td> 
<td width="5%"></td> 
<td>&nbsp;</td> 
</tr> 
</table> 
</ItemTemplate> 

</asp:Repeater> 

중계기에 대한 데이터를 얻는 코드입니다 : 여기
Dim imagepathlit As Literal = DownloadsRepeater.FindControl("imagepathlit") 
     imagepathlit.Text = imagepath 

는 중계기

c.Open() 
     r = x.ExecuteReader 
     While r.Read() 
      If r("filename") Is DBNull.Value Then 
       imagepath = String.Empty 
      Else 
       imagepath = "<img src=images/" & getimage(r("filename")) & " border=0 align=absmiddle>" 
      End If 

     End While 
     c.Close() 
     r.Close() 
+0

더 설명이 필요하고 관련 코드 – Brij

+0

를 추가한다? 확실히 imagepathlit은 찾고자하는 곳에는 존재하지 않습니다. 우리가 그것을 할 수있는 적절한 방법으로 대답 할 수있는 ASPX 붙여 넣기 –

답변

1

내 생각은 DownloadsRepeater에서 발견 통제가 없다는 것입니다 컨트롤이 imagepathlit이라고 불리우므로 호출 후 imagepathlit 컨트롤이 null입니다.

Control.FindControl()은 컨트롤의 이름이 아닌 ID을 기반으로 컨트롤을 찾습니다. 따라서, 컬렉션의 컨트롤을 찾을 수 ... 당신은 응용 프로그램에서 이전에 이런 일이 있었다 할 것이다 :

Dim imagepathlit As Literal = new Literal() 
imagepathlit.ID = "imagepathlit" 

UPDATE를

리피터, 자식 컨트롤을 사용하고 있기 때문에 조금 다르게 레이아웃을 잡아라. Repeater에 각 Item에 대해 Literal의 인스턴스를 갖게됩니다. 따라서, 컨트롤의 각 인스턴스를 얻기 위해, 당신은 Repeater에서 Items을 통해 루프가 각 ItemFindControl() 전화 : 당신이 게시 코드가 예외가 실제로 발생되는 경우, 나는 말할 것입니다 가정

For Each item As Item In DownloadsRepeater.Items 
    Dim imagepathlit As Literal = item.FindControl("imagepathlit") 
Next 
+0

리터럴이 같은. ASPX에 있습니다; Phil

+0

고마워요 Justin – Phil

1

DownloadRepeater에는 ID가 imagepathlit 인 컨트롤이 없습니다.

aspx을 확인하십시오.

1

컨트롤이 ItemTemplate 내에 있기 때문에 repeater.findcontrol을 사용할 수 없습니다. itemtemplate은 반복 가능하므로 컨트롤을 찾으려면 repeater의 항목을 반복해야합니다. 따라서 다음과 같이 컨트롤을 찾으려면 각 루프를 반복해야합니다.

foreach (var item in repeater.Items) 
{ 
    var control = item.FindControl("ID") as Type; 
} 

구문을 사용하십시오.

-1

내 코드는 다음과 같습니다 당신이 중계기 영문 부분을 붙여 넣을 수

protected void GridView2_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    SqlConnection Conn = new 
    SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()); 
    SqlCommand Cmd = new SqlCommand(); 
    if (e.CommandName =="Buy") 
    { 
     ImageButton img = (ImageButton)e.CommandSource; 
     int Index = Convert.ToInt32(e.CommandArgument); 
     GridViewRow Row = GridView2.Rows[Index]; 
     Label l1 = (Label)Row.FindControl("Label3"); 
     Label l2 = (Label)Row.FindControl("Label2"); 
     Label l3 = (Label)Row.FindControl("Label1"); 
     Session["user"] = "mohammad"; 
     Cmd = new SqlCommand("Insert Into Trade(pname,pdesc,price,uname)values('" + l1.Text + "','" + l2.Text + "','" + l3.Text.Replace("$", "") + "','" + Session["user"].ToString() + "')", Conn); 
     Conn.Open(); 
     Cmd.ExecuteNonQuery(); 
     Conn.Close(); 
     string Url = ""; 
     Url += "https://www.sandbox.paypal.com/cgibin/webscr?cmd=_xclick&business=" + 
     ConfigurationManager.AppSettings["paypalemail"].ToString(); 
     Url += "&first_name=Mohamed"; 
     Url += "&city=chennai"; 
     Url += "&state=tamilnadu"; 
     Url += "&item_name=" + l1.Text; 
     Url += "&amount=" + l3.Text.Replace("$", ""); 
     Url += "&shipping=5"; 
     Url += "&handling=5"; 
     Url += "&tax=5"; ; 
     Url += "&quantity=1"; 
     Url += "&currency=USD"; 
     Url += "&return=" + 
     ConfigurationManager.AppSettings["SuccessURL"].ToString(); 
     Url += "&cancel_return=" + 
     ConfigurationManager.AppSettings["FailedURL"].ToString(); 
     Response.Redirect(Url); 
    } 
} 
+0

당신은 솔루션에 약간의 설명을 추가해야합니다 – timiTao

+0

이 질문은 8 년 전에 요청되었으며 일반적인 질문이 아닙니다. 다른 사람들이 귀하의 솔루션으로부터 이익을 얻을 수 있습니다. ** 당신 **에게 질문이있는 경우 적절한 할 일은 새로운 질문 *을하거나이 질문이나 다른 기존 질문에 답을 쓰지 않는 것입니다. **이 답변을 삭제하십시오. ** – Igor