Jan 28
2009

Um eine ASP.NET DropDownList mit Werten aus einem Enum zu füllen, gibt es unterschiedliche Ansätze.

Beispielsweise kann das Enum für einen LoginStatus folgendermaßen aussehen:

/// <summary>
/// enum for login status
/// </summary>
public
enum LoginState
{
  Inactive = -1,
  Active = 1,
  Deactivated = 2
}

Um das DropDown mit den Werten des Enum zu füllen, sind zwei Zeilen Code ausreichend:

/// <summary>
/// fills ddlContactPersonLoginState
/// </summary>
private void FillContactPersonLoginStateDropDown()
{
  ddlContactPersonLoginState.DataSource =
Enum.GetNames(typeof(LoginState));
  ddlContactPersonLoginState.DataBind();
}

Allerdings hat diese Lösung zur Folge, dass value und key im DropDown gleich sind.

 

Ein anderer Ansatz über eine Hilfsmethode erlaubt es, value und key separat zu ermitteln
und dem DropDown als DataValueField und DataTextField zuzuweisen:

/// <summary>
/// helpermethod to store enum values and their corresponding names in a SortedList
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static SortedList<string, int> GetEnumDataSource<T>() where T : struct
{
 
Type myEnumType = typeof(T);
 
if (myEnumType.BaseType != typeof(Enum))
  {
   
throw new ArgumentException("Type T must inherit from System.Enum");
  }

  SortedList<string, int> returnCollection = new SortedList<string, int>();
 
string[] enumNames = Enum.GetNames(myEnumType);

  for (int i = 0; i < enumNames.Length; i++)
  {
    returnCollection.Add(enumNames[i], (
int)Enum.Parse(myEnumType, enumNames[i]));
  }
  return returnCollection;

}

Das Füllen des DropDowns muss jetzt etwas erweitert werden:

/// <summary>
/// fills ddlContactPersonLoginState
/// </summary>
private
void FillContactPersonLoginStateDropDown()
{
 
ddlContactPersonLoginState.DataSource = GetEnumDataSource<LoginState>();
 
ddlContactPersonLoginState.DataValueField = "Value";
  ddlContactPersonLoginState.DataTextField ="Key";
  ddlContactPersonLoginState.DataBind();
}

Jetzt stehen im DropDown Value und Key für die weitere Verarbeitung zur Verfügung.

Tags:
Jan 14
2009

Das GridView Servercontrol von ASP.NET 2.0 bietet eine Vielzahl von Möglichkeiten, Spalten mit Informationen zu versehen. Gelegentlich ist es notwendig, eine Spalte mit einer Checkbox zu versehen, um Zeilen einzeln wählen zu können. Das ist schnell implementiert. Allerdings wird es etwas tricky, wenn nur jeweils eine Checkbox aktiviert sein darf, also vergleichbar mit einer Reihe von RadioButtons.
Mit etwas JavaScript ist dieser UseCase jedoch auch problemlos umsetzbar.

So könnte die Spalte im GridView aussehen, in dem es beispielweise nur einen Hauptansprechpartner geben darf:

Hier die CheckBox Deklaration im GridView: 

<asp:TemplateField HeaderText="Haupt AP">
  <ItemTemplate>
    <asp:CheckBox
      ID="cbxIsMainUser"
      runat="server"
      CssClass="cbxCheckbox" /> 
  </ItemTemplate>
</asp:TemplateField>

Hier das JavaScript im aspx-Code:

<script type="text/javascript" language="javascript">
  function uncheckOthers(id)
  {
    var elm = document.getElementsByTagName('input'); for(var i = 0; i < elm.length; i++)
    {
      if(elm.item(i).id.substring(id.id.lastIndexOf('_')) == id.id.substring(id.id.lastIndexOf('_'))) 
      {
        if( elm.item(i).type == "checkbox" && elm.item(i)!=id)elm.item(i).checked =
false;
      }
    }
  }
</script>

RowDataBound des GridView im Codebehind:

//allow only one checkbox in column to be checked using javascript:
CheckBox cbxIsMainUser = (CheckBox)e.Row.FindControl("cbxIsMainUser");
string strScript = "uncheckOthers(" + cbxIsMainUser.ClientID + ");";
cbxIsMainUser.Attributes.Add("onclick", strScript);

Tags: