2012年12月15日土曜日

ASP.NET GridView カラムにアクセスできない時は・・・

GridView のカラムにアクセスしようとしても、AutoGenerateColumns="true" だと Columns.Count が 0 になります!

AutoGenerateColumns="false" にして列定義をするとコードビハインドから Columns コレクションにアクセスできるようになります。

http://stackoverflow.com/questions/3819247/gridview-hide-column-by-code

2012年12月13日木曜日

ASP.NET 開発サーバーでのプロジェクト実行

元々IIS上で動かしていたプロジェクトを Visual Studio の開発サーバーで動作させようとすると、以下のエラーが出ることがあります。

このプロジェクトを開くには、仮想ディレクトリを構成する必要があります。今すぐ仮想ディレクトリを作成しますか?



これは、プロジェクトの Web.config で「IISを使います」という指定がされているため開発サーバーで動作させることができないためです。UseIIS に False を設定することでプロジェクトを開発サーバーで動作させることができるようになります。

Web.config 設定箇所: ProjectExtensions - VisualStudio - FlavorProperties - WebProjectProperties - UseIIS






2012年12月10日月曜日

HTMLエンコードツール

blogger で Syntax Highlighter を使おうとしても、実装コードそのままではうまくハイライトされません。コードの特殊文字をエンティティ化しないといけないみたいなので、ツールを作ってみました。

置き換える文字は「&」、「>」、「"」、「'」の4つです。












2012年12月9日日曜日

WPF コンテキストメニューを作ってみよう!

今回は簡単なコンテキストメニューを実装してみます。
WPF の コンテキストメニューは FrameworkElement のプロパティですので Button、RadioButton、CheckBox、TextBlock などのコントロールで利用できます。

実装方法はコントロールの ContextMenu クラスに MenuItem を割り当てます。
ここでは Style を使ってコンテキストメニューを用意していますが、コントロールに直接定義することもできます。

<Grid>
    <Grid.Resources>
        <!-- コンテキストメニュー -->
        <Style TargetType="Button">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="1"/>
                        <MenuItem Header="2"/>
                        <MenuItem Header="3"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    <Button Content="Button"
            Name="button1"
            Height="23"
            Width="75">
        <!-- これでもいけます -->
        <!--<Button.ContextMenu>
            <ContextMenu>
                <MenuItem Header="item1"/>
                <MenuItem Header="item2"/>
                <MenuItem Header="item3"/>
            </ContextMenu>
        </Button.ContextMenu>-->
    </Button>
</Grid>



FrameworkElement の派生クラスはこちら↓

FrameworkElement 階層
http://msdn.microsoft.com/ja-jp/library/ms602719%28v=vs.80%29.aspx

2012年12月8日土曜日

WPF テンプレート編集

WPF ではテンプレートを編集することで、簡単に見た目を変えることができます。今回は、RadioButton に Button の外観を設定してオプションボタンを作成してみます。 (エクセルにあるやつです。)


1.ExpressionBlend で RadioButton のテンプレートをコピーして編集します。
コンテキストメニューの「テンプレートの編集」 →「コピーして編集」

テンプレートを編集
テンプレートを編集






2.デフォルトで使われている BulletDecorator を Button コントロールに置き換えます。

<Window.Resources>
  <SolidColorBrush x:Key="CheckBoxStroke" Color="#8E8F8F"/>
  <Style x:Key="CheckRadioFocusVisual">
   <Setter Property="Control.Template">
    <Setter.Value>
     <ControlTemplate>
      <Rectangle Margin="14,0,0,0"
                 SnapsToDevicePixels="true"
                 Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
                 StrokeThickness="1"
                 StrokeDashArray="1 2"/>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
  <Style TargetType="{x:Type RadioButton}">
   <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
   <Setter Property="Background" Value="#F4F4F4"/>
   <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}" />
   <Setter Property="BorderThickness" Value="1"/>
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type RadioButton}">
      <!-- デフォルトの BulletDecorator をコメントアウト -->
      <!--<BulletDecorator>
       <BulletDecorator.Bullet>
        <Microsoft_Windows_Themes:BulletChrome
                  BorderBrush="{TemplateBinding BorderBrush}"
                  Background="{TemplateBinding Background}"
                  IsChecked="{TemplateBinding IsChecked}"
                  IsRound="true"
                  RenderMouseOver="{TemplateBinding IsMouseOver}"
                  RenderPressed="{TemplateBinding IsPressed}"/>
       </BulletDecorator.Bullet>
       <ContentPresenter
               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
               Margin="{TemplateBinding Padding}"
               RecognizesAccessKey="True"
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
      </BulletDecorator>-->
      <!-- 代わりに Button を配置 -->
      <Button>
       <Button.Content>
        <ContentPresenter
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                  RecognizesAccessKey="True"
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
       </Button.Content>
      </Button>
      <!-- 代わりに Button を配置 -->
      <ControlTemplate.Triggers>
       <Trigger Property="HasContent" Value="true">
        <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/>
        <Setter Property="Padding" Value="4,0,0,0"/>
       </Trigger>
       <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
       </Trigger>
      </ControlTemplate.Triggers>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
 </Window.Resources>
    <Grid>
        <RadioButton GroupName="radio"
                     Content="A"
                     x:Name="radioButton1"
                     Height="30" Width="30" Margin="200,141,273,140" />
        <RadioButton GroupName="radio"
                     Content="B"
                     x:Name="radioButton2"
                     Height="30" Width="30" Margin="236,141,237,140" />
        <RadioButton GroupName="radio"
                     Content="C"
                     x:Name="radioButton3"
                     Height="30" Width="30" Margin="272,141,201,140" />
    </Grid>


複数あるボタンから一つのみを選択することができます。RadioButton なので当然ですが ^^;
オプションボタン

2012年12月7日金曜日

匿名メソッド・ラムダ式

匿名メソッドとラムダ式の実装例です。
public MainWindow()
{
    InitializeComponent();

    // イベントハンドラのデリゲート
    this.button1.Click += new RoutedEventHandler(button1_Click);

    // 匿名メソッド
    this.button1.Click += delegate(object sender, RoutedEventArgs e)
    {
        Debug.WriteLine("匿名メソッド");
    };

    // ラムダ式いろいろ
    // ラムダ式1行の場合 その1
    this.button1.Click += (sender, e) => Debug.WriteLine("ラムダで1行");

    // ラムダ式1行の場合 その2
    this.button1.Click += (sender, e) =>
    {
        MessageBox.Show("こんな風にも書けます");
    };

    // ラムダ式複数行の場合
    this.Loaded += (sender, e) =>
    {
        Debug.WriteLine("複数行で");
        Debug.WriteLine("書く場合");
    };
}

// イベントハンドラ
private void button1_Click(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("イベントハンドラ");
}


10 行でズバリ!! 匿名メソッドによるイベント ハンドラの実装 (C#)
http://code.msdn.microsoft.com/windowsdesktop/10-C-367d998d

2012年12月3日月曜日

ASP.NET GridView でページング

ASP.NET の GridView でページングを使う実装例です。
ページング時に発生する PageIndexChanging をハンドルしてページインデックス指定とデータの再バインドをします。↓こんな感じ

ASPX
<asp:GridView ID="GridView1" runat="server"
                  AllowPaging="True" Height="292px" 
                  onpageindexchanging="GridView1_PageIndexChanging"
                  Width="406px">
</asp:GridView>

C#
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataColumn[] PrimaryColumn = new DataColumn[1];
        DataTable datatable = new DataTable();
        PrimaryColumn[0] = datatable.Columns.Add("ID", typeof(string));
        datatable.Columns.Add("ProductName", typeof(string));
        datatable.Columns.Add("Description", typeof(string));

        for (int i = 0; i < 100; i++)
        {
            datatable.Rows.Add(i.ToString(), "Product : " + i.ToString(), "Note : " + i.ToString());
        }

        datatable.PrimaryKey = PrimaryColumn;

        Session["data"] = datatable;
    }

    this.GridView1.DataSource = Session["data"];
    this.GridView1.DataBind();
}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    this.GridView1.PageIndex = e.NewPageIndex;
    this.GridView1.DataBind();
}


PageIndexChanging に上記実装をしていないと、ページが変わりません。ご注意下さい~!!


paging in gridview in asp.net
http://www.codeproject.com/Questions/262776/paging-in-gridview-in-asp-net