문제

데이터의 문자열 값이 확인란의 레이블이되고 bool 값이 상자를 선택 취소 할 수 있도록 ASP.NET CheckBoxList를 데이터를 데이터에 데이터베이션 할 수 있습니까?

내 asp.net webform에는 다음과 같은 checkboxlist가 있습니다.

<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" />

뒤에있는 코드에는이 코드가 있습니다.

var usersInRole = new List<UserInRole> 
{ 
  new UserInRole { UserName = "Frank", InRole = false},
  new UserInRole{UserName = "Linda", InRole = true},
  new UserInRole{UserName = "James", InRole = true},
};

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

나는 수표가 참을 때 확인란이 확인되기를 바라고 있습니다. 또한 Inrole = "Checked"를 시도했습니다. 결과는 동일했습니다. Databind의 방법을 찾을 수 없으며 자동으로 확인란을 확인/확인하지 않은 채로 확인합니다.

현재 데이터 바운드 이벤트에서 적절한 항목에 대해 선택된 = true를 설정하여 문제를 해결합니다. 내 손아귀를 넘어 더 깨끗한 솔루션이있는 것 같습니다.

감사합니다

도움이 되었습니까?

해결책

편집하다: 마크 업을 통해이 작업을 수행 할 방법이 없습니다. Datavaluefield는 확인란 항목이 확인되는지 여부를 결정하지 않습니다. 포스트 백에서 사용할 값을 검색하거나 저장합니다. 그만큼 Datavaluefield CheckBoxList, RadioButtonlist, ListControl 등에 일반적입니다.

이것은 이미 발견 한대로 확인란을 사전 선택하는 유일한 방법입니다.

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

foreach(ListItem item in chkListRoles.Items)
 item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;

다른 팁

나는 피곤한 후 이것에 대한 맞춤 제어를했다. OnItemDataBound-제본. 그것은 당신이 당신을 묶을 수있게 해줄 것입니다 Selected 기인하다. 당신은 쉽게 동일한 제어를 할 수 있습니다 RadioButtonList 사용자 정의 컨트롤이 얻은 것을 변경함으로써.

이것을 사용하려면 간단히 추가하십시오 DataCheckedField 속성 마크 업에서 컨트롤을 생성 할 때. 귀하의 사용자 정의 컨트롤을 참조하십시오 web.config 파일.

마크 업

<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles"
                               DataCheckedField="InRole"
                               DataTextField="UserName"
                               DataValueField="UserId" />

제어를위한 코드

public class SimpleCheckBoxList : System.Web.UI.WebControls.CheckBoxList
{
    public string DataCheckedField
    {
        get
        {
            string s = (string)ViewState["DataCheckedField"];
            return (s == null) ? String.Empty : s;
        }
        set
        {
            ViewState["DataCheckedField"] = value;
            if (Initialized)
                OnDataPropertyChanged();
        }
    }

    protected override void PerformDataBinding(IEnumerable dataSource)
    {
        if (dataSource != null)
        {
            if (!this.AppendDataBoundItems)
                this.Items.Clear();

            if (dataSource is ICollection)
                this.Items.Capacity = (dataSource as ICollection).Count + this.Items.Count;

            foreach (object dataItem in dataSource)
            {
                ListItem item = new ListItem()
                {
                    Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(),
                    Value = DataBinder.GetPropertyValue(dataItem, DataValueField).ToString(),
                    Selected = (DataCheckedField.Length > 0) ? (bool)DataBinder.GetPropertyValue(dataItem, DataCheckedField) : false
                };
                this.Items.Add(item);
            }
        }
    }
}

마크 업을 사용하는 것은 불가능합니다. 당신이 할 수있는 일은 Datavaluefield의 bool과 함께 작동하기를 원했던 것처럼 checkboxlist를 바인딩 한 다음 이것을 온다 내재 이벤트로 추가하는 것입니다.

protected void myCheckBoxList_DataBound(object sender, EventArgs e)
    {
        foreach (ListItem item in myCheckBoxList.Items)
        {
            item.Selected = bool.Parse(item.Value);
        }
    }

이 솔루션의 차이점과 Jose Basilio가 제안한 솔루션의 차이점은 이것이 모든 종류의 데이터 바인딩 방법과 함께 작동한다는 것입니다. 예를 들어 v4.5의 새로운 ModelBinding 기능을 사용하여 SELECTMETHOD와 바인딩합니다.

나는 당신이 그것을 통제 할 수있는 속성을 말해야한다고 생각할 것입니다.

나는 그것을 가지고 놀았고 이제 확인란의 선택에 묶을 것 같다. 당신은 직접해야한다. 목록에있는 각 확인란의 레이블 만 다루는 것처럼 보이는 체크리스트의 텍스트와 값에 바인딩 할 수있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top