2013-10-04 1 views
0

확인란을 사용하여 일부 테이블 값을 업데이트해야합니다. 표는 id, name 및 selected (bool)의 세 가지 간단한 열로 구성됩니다. 폼에 CheckBoxList 컨트롤을 의 SqlDataSource에 바인딩 : Asp.Net CheckBoxList를 사용하여 SqlDataSource 업데이트

은 내가 ASP를 추가했다. 간단한 코드 MySqlDataSource.Update 버튼을 추가했습니다.(); 그런 다음 페이지로 이동하십시오.

나는 확인란을 클릭 한 다음 나는이 데이터베이스에 전송 된 것입니다 볼 수있는 SQL Server 프로파일 러를 데이터 소스를 업데이트 할 수있는 버튼을 클릭하여 사용 :

exec sp_executesql N'UPDATE [MyTable] SET [Name] = @Name, [Selected] = @Selected 
WHERE  [Id] = @Id',N'@Name nvarchar(4000),@Selected bit, 
@Id int',@Name=NULL,@Selected=NULL,@Id=NULL 

문제는 분명하다, 값이 없습니다 설정되고 ....하지만 왜?

테스트 목적으로 똑같은 SqlDataSource를 사용하여 GridView를 추가했는데 그 중 하나의 비트를 이동하지 않고 GridView를 추가했으며 "편집"링크를 클릭 한 다음 확인란을 클릭하여 레코드를 수정할 수 있습니다. "업데이트"링크를 클릭하면 데이터베이스에 저장되며 Sql Server에 업데이트 명령을 올바르게 보냅니다.

MyDataSource의 UpdateQuery 속성으로 이동하면 "매개 변수 원본"을 설정할 수있는 옵션이 있지만 드롭 다운 목록에서 동일한 데이터 소스의 매개 변수 원본을 설정할 수 없습니다. 내가 뭔가를 여기에서 놓치고있는 것처럼 보인다. ... 그러나 왜 동일한 SqlDataSource가 GridView에서 작동합니까?

업데이트를 수행하기 위해 CheckboxList를 사용하는 것에 대한 샘플을 검색하는 데 몇 시간을 소비했는데 많은 샘플을 발견했지만 ... 대부분은 목적을 표시하기위한 것입니다. CheckboxList가 실제로 업데이트 할 수 있는지 궁금합니다.

UPDATE는 CheckBoxList로 매개 변수 소스를 설정하는 조언을 따랐다. Name 및 Selected 열에 대한 매개 변수 원본을 "SelectedValue"속성으로 설정했습니다. 그것은 행동을 변경,하지만 여전히 잘못 작동, 이제 데이터베이스로 전송 쿼리는 다음과 같습니다

exec sp_executesql N'UPDATE [MyTable] SET [Name] = @Name, [Selected] = @Selected WHERE  [Id] = @Id',N'@Name nvarchar(5),@Selected bit,@Id int',@Name=N'False',@Selected=0,@Id=NULL 

당신은 이드가 여전히 "거짓"과 "0"대신에 널 (null)의, 그러나입니다 보냅니다 지금 볼 수 있습니다 "null"로 전송됩니다.

그래서 매개 변수 소스 유형을 Control, CheckboxList로 설정 한 다음 SelectedValue 속성을 Selected로 설정하여 매개 변수를 변경했습니다. 이제 오류 메시지는 다음과 같습니다.

"입력 문자열의 형식이 올바르지 않습니다."

"현재"확인란 항목에서 기본 값을 가져 오는 방법이되어야한다고 생각하지만 왜 그런지 모르고 예제를 찾고 있습니다.

+1

어떻게 작동해야하는지 알 수 없습니다. 마크 업을 게시 할 수 있습니까? 데이터 목록/ListView/GridView 귀하의 문제를 해결하기 위해 더 나은 옵션을 것 같아요. – jbl

+0

그렇다면 왜 sqldatasource가되어야합니까? 당신은 할 수 있습니다. 다른 것을 시도함으로써 당신의 목표를 달성하십시오. 그러나 그것에 충실하십시오. 그러면 @jbl은 당신에게 더 많은 코드와 마크 업을 제공해야합니다. –

+0

안녕하세요, 고맙지 만 ... 삭제 된 답변이 있습니다. , 나는 왜이 CheckBoxList가이 경우에 적합하지 않다고 결론을 내 렸는지 모르겠다. 따라서 코드가 필요하지 않습니다.이 중 하나가 작동해야하거나 그렇지 않습니다. 그게 내 질문이다. –

답변

3

asp:CheckBoxList처럼 보이지만 추가 기능이있는 중계기 구조를 만들었습니다. 여기가 브라우저의 모습입니다 :

여기

Sample View

가있다.영문 코드 :

<form id="form1" runat="server"> 
<div> 
    <asp:Repeater ID="Repeater1" runat="server"> 
     <ItemTemplate> 
      <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# (bool)Eval("Selected") %>' /> 
      <asp:Label ID="Label1" runat="server" Text='<%# Eval("Name")%>' AssociatedControlID="CheckBox1"></asp:Label> 
      <div style="clear:both;height:5px;"></div> 
     </ItemTemplate> 
    </asp:Repeater> 
    <div style="clear:both;height:45px;"></div> 
    <asp:Button ID="Update_Button" runat="server" Text="Update" 
     OnClick="Update_Button_Click" /> 
</div> 
</form> 

그리고 숨김 : 여기

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //Fake DataTable below. 
      //SqlDataSource can be configured to generate a DataTable, 
      //Or you can use a DataAdapter 

      DataTable dt = new DataTable(); 

      DataColumn dc1 = new DataColumn("Name"); 
      DataColumn dc2 = new DataColumn("Id"); 
      DataColumn dc3 = new DataColumn("Selected"); 
      dc3.DataType = System.Type.GetType("System.Boolean"); 

      dt.Columns.Add(dc1); 
      dt.Columns.Add(dc2); 
      dt.Columns.Add(dc3); 

      dt.Rows.Add(new object[] { "John Doe", "135681", true }); 
      dt.Rows.Add(new object[] { "Billy Joe", "66541", false }); 
      dt.Rows.Add(new object[] { "Joe Shmoe", "7783654", true }); 
      dt.Rows.Add(new object[] { "Don Sean", "1332451", true }); 
      dt.Rows.Add(new object[] { "Moe H", "632451", false }); 
      dt.Rows.Add(new object[] { "Clicky", "0234354", true }); 

      //Bind DataTable to Repeater 
      Repeater1.DataSource = dt; 
      Repeater1.DataBind(); 

     } 
    } 

    protected void Update_Button_Click(object sender, EventArgs e) 
    { 
     List<Person> Listy = new List<Person>(); 

     ControlCollection CC = Repeater1.Controls;    

     foreach (RepeaterItem RI in CC) 
     { 
      Person p = new Person(); 

      foreach (Control c in RI.Controls) 
      { 
       if (c is System.Web.UI.WebControls.CheckBox) 
       { 
        if (((System.Web.UI.WebControls.CheckBox)c).Checked) 
         p.Selected = true; 
        else p.Selected = false;       
       } 
       if (c is System.Web.UI.WebControls.Label) 
       { 
        p.Name = ((System.Web.UI.WebControls.Label)c).Text; 
       } 
      } 

      Listy.Add(p); 
     } 

     UpdateDatabase(Listy); 
    } 

    protected void UpdateDatabase(List<Person> L) 
    { 
     foreach (Person p in L) 
     { 
      string update = "UPDATE [Table] SET [Selected] = " + p.Selected + "WHERE [Name] = " + p.Name; 
      // Execute statement 
     } 
    } 
} 

public class Person 
{ 
    public string Name { get; set; } 
    //public int ID { get; set; } 
    public bool Selected { get; set; } 
} 

그리고 업데이트 문을 열어 디버거이다. 모든 값이 정확합니다! Debug

은 분명히 개선의 여지가있다, 그러나 희망이 당신에게 진행 방법의 좋은 아이디어를 줄 것이다!

+0

저는 리피터가 제공하는 다용도성에 대해 다른 템플릿 컨트롤보다 더 좋아합니다. 거의 항상 리피터를 사용합니다. 이 유용한 답변을 Upvote하지만 SqlDataSources를 처리 할 때 GridView와 ListView는 CRUD 논리가 내장되어 있으므로 Repeater보다 훨씬 낫다고 말해야합니다. – jbl

+0

이름 열 대신 ID 열을 사용하여 작동하게하는 방법이 있습니까? 인덱스가없는 열을 기반으로 검색 ("where")을 수행하는 것이 좋지 않습니다. : –

+1

가장 쉬운 방법은 레이블과 확인란 사이에 ID에 바인딩 된 숨겨진 필드를 추가하는 것입니다. 숨김 필드를 찾으려면'if (c is System.Web.UI.WebControls.Label)'을 변경 한 다음 ID를 기반으로 데이터베이스를 업데이트하십시오. 웹 응용 프로그램 중 하나에서 비슷한 메서드를 사용하지만 포스트 백 대신 ajax를 사용합니다. – Zerkey

0

ID 열이 고유한지 확인하십시오 (키 + 자동 번호 매기기). "WHERE"는 ID 열만 참조하고 "SET"는 true \ false 열 (확인하는 열)을 나타냅니다. 당신은 간단한 쿼리, 쉬운 드래그의 DataSet.xsd을 사용하고 개체를 삭제할 수 있습니다 ASP.NET 2.0 Gridview CheckBox column How to add event for Checkbox click in Asp.net Gridview Column

: 다음 reffs를 사용할 수있는 "검사"이벤트를 잡기 위해

UPDATE [dbo].[Table_1] 
SET [CheckBoxCol] = @CheckBoxCol 
WHERE (([id] = @Original_id)) 

데이터베이스 쿼리를 만듭니다.