2010年12月9日星期四

GridView Databinding注意事項

GridViewのデータバインディングについて、MSDNにはいろいろな例がありますが、
EIDTモード場合のバインディングは足りないと思います。
GridViewはDatatableにバインディングした後、Editモードにするのはどうすればいいか、
はっきりしていないです。

実際にはGridViewのEditIndexを設定すればOKです。
即ち、以下のソースで説明します。
Protected Sub Grid_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) _
    Handles grd.RowEditing 
   ’編集開始イベントの中で、新たな編集先行番を設定する必要です。
        grd.EditIndex= e.NewEditIndex
   '設定完了後、再びGridにDataSourceのバインディングが必要です。
        grd.DataBind()
End Sub

なお、編集キャンセルしたい場合、GridView.EditIndex=-1にリセットが必要です。
キャンセルボタンに関連することも可能です。
Protected Sub Grid_RowCancelingEdit(ByVal sender As Object, ByVal e As GridViewCancelEditEventArgs) _
    Handles grd.RowCancelingEdit
        grd.EditIndex= -1
        grd.DataBind()
    End Sub

===============
同じく、GridViewの行選択が変わりたい場合、GridView.SelectedIndexの指定が必要です。
以下例:
Protected Sub Grid_SelectedIndexChanging(ByVal sender As Object, ByVal e As GridViewSelectEventArgs)  Handles grd.SelectedIndexChanging
        grd.SelectedIndex = e.NewSelectedIndex
        grd.DataBind()
End Sub

===============

同じくGridViewの頁が変わりたい場合、GridView.PageIndexの指定が必要です。
以下例:
Protected Sub Grid_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs) _
    Handles grd.PageIndexChanging
        if grd.PageIndex <> e.NewPageIndex then
            grd.PageIndex = e.NewPageIndex
        End If
       grd.DataBind()
    End Sub

以上の例は皆変更しようとすると、対応Indexの設定が必要で、その後またDataBind()の再バインディングが必要です。しないと、データが表示しないです。
grdのDataSourceはGridViewのEnableViewState=trueの場合(ディフォルトはtrue)、ViewStateの保存されます、再DataSourceの指定は不要です、逆に指定したら、新たなDataSourceとして扱うことになります。

データ バインディング構文

データ バインディング式は <%# デリミタと %> デリミタの間に記述され、Eval 関数と Bind 関数を使用します。Eval 関数は、一方向 (読み取り専用) バインディングを定義するために使用します。Bind 関数は、双方向 (更新可能) バインディングに使用します。Eval メソッドと Bind メソッドを呼び出してデータ バインディング式でデータ バインディングを実行することに加えて、<%# デリミタと %> デリミタの間でパブリックにスコープされた任意のコードを呼び出して実行し、ページの処理中に値を返すことができます。
データ バインディング式は、コントロールの DataBind メソッドまたは Page クラスが呼び出されたときに解決されます。GridView、DetailsView、FormView などのコントロールでは、データ バインディング式はコントロールの PreRender イベントの中で自動的に解決されるので、DataBind メソッドを明示的に呼び出す必要はありません。
ItemTemplate の FormView コントロールと共にデータ バインディング式を使用するコード例を次に示します。

Eval メソッドの使用
Eval メソッドは、GridView、DetailsView、FormView などのデータ バインド コントロールのテンプレートの遅延バインディング データ式を評価します。Eval メソッドは、名前付けコンテナの現在のデータ項目を参照する DataBinder オブジェクトの Eval メソッドを実行時に呼び出します。名前付けコンテナは、GridView コントロールの行などのように、一般にレコード全体を含むデータ バインド コントロールの最小単位です。したがって、Eval メソッドは、データ バインド コントロールのテンプレート内のバインディングにのみ使用できます。
Eval メソッドはデータ フィールドの名前を受け取り、データ ソースの現在のレコードからそのフィールドの値を含む文字列を返します。2 番目のパラメータを指定して、返される文字列の形式を指定することもできます (省略可能)。文字列の書式指定パラメータは、String クラスの Format メソッドに対して定義された構文を使用します。
<asp:FormView ID="FormView1"
  DataSourceID="SqlDataSource1"
  DataKeyNames="ProductID"    
  RunAt="server">
                                   
  <ItemTemplate>
    <table>
      <tr><td align="right"><b>Product ID:</b></td>       <td><%# Eval("ProductID") %></td></tr>
      <tr><td align="right"><b>Product Name:</b></td>     <td><%# Eval("ProductName") %></td></tr>
      <tr><td align="right"><b>Category ID:</b></td>      <td><%# Eval("CategoryID") %></td></tr>
      <tr><td align="right"><b>Quantity Per Unit:</b></td><td><%# Eval("QuantityPerUnit") %></td></tr>
      <tr><td align="right"><b>Unit Price:</b></td>       <td><%# Eval("UnitPrice") %></td></tr>
    </table>                
  </ItemTemplate>                  
</asp:FormView>

Bind メソッドの使用
Bind メソッドは、Eval メソッドに部分的に似ていますが、重要な違いがあります。Eval メソッドと同様に、Bind メソッドを使用してもデータ バインド フィールドの値を取得できますが、Bind メソッドはデータを変更できる場合にも使用します。
ASP.NET では、GridView、DetailsView、FormView などのデータ バインド コントロールは、データ ソース コントロールの更新、削除、および挿入操作を自動的に使用します。たとえば、データ ソース コントロールに対して SQL の Select、Insert、Delete、および Update ステートメントを定義している場合、GridView、DetailsView、または FormView コントロールのテンプレートで Bind を使用すると、そのコントロールで、テンプレートの子コントロールから値を抽出してデータ ソース コントロールに渡すことができます。次に、データ ソース コントロールは、データベースに対して適切なコマンドを実行します。そのために、データ バインド コントロールの EditItemTemplate または InsertItemTemplate の内部では Bind 関数が使用されます。
Bind メソッドは、編集モードの GridView 行によってレンダリングされた TextBox コントロールなどの入力コントロールで一般的に使用されます。データ バインド コントロールは、自身のレンダリング処理の一部としてこのような入力コントロールを作成する場合、入力値を抽出できます。
Bind メソッドは、次の例に示すように、データ フィールドの名前を受け取ってバインド プロパティに関連付けます。
セキュリティに関するメモ : 
この例には、ユーザー入力を受け付けるテキスト ボックスがあるため、セキュリティ上の脅威になる可能性があります。既定では、ASP.NET Web ページは、ユーザー入力にスクリプトまたは HTML 要素が含まれていないことを検証します。詳細については、「スクリプトによる攻略の概要」を参照してください。

コピー<EditItemTemplate>
  <table>
    <tr>
      <td align=right>
        <b>Employee ID:</b>
      </td>
      <td>
        <%# Eval("EmployeeID") %>
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>First Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditFirstNameTextBox" RunAt="Server"
          Text='<%# Bind("FirstName") %>' />
      </td>
    </tr>
    <tr>
      <td align=right>
        <b>Last Name:</b>
      </td>
      <td>
        <asp:TextBox ID="EditLastNameTextBox" RunAt="Server"
            Text='<%# Bind("LastName") %>'  />
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <asp:LinkButton ID="UpdateButton" RunAt="server"
          Text="Update" CommandName="Update" />
        &nbsp;
        <asp:LinkButton ID="CancelUpdateButton" RunAt="server"
          Text="Cancel" CommandName="Cancel" />
      </td>
    </tr>
  </table>
</EditItemTemplate>
行の Update ボタンがクリックされると、Bind 構文を使用してバインドされた各コントロール プロパティの値が抽出され、更新操作のためにデータ ソース コントロールに渡されます。
DataBind メソッドの明示的な呼び出し
GridView、FormView、DetailsView などのコントロールは、DataSourceID プロパティを使用してデータ ソース コントロールにバインドされるときに DataBind メソッドを暗黙的に呼び出してバインディングを実行します。ただし、明示的に DataBind メソッドを呼び出す必要がある場合もあります。
そのような状況の 1 つは、DataSourceID プロパティの代わりに DataSource プロパティを使用してコントロールをデータ ソース コントロールにバインドした場合です。その場合は、明示的に DataBind メソッドを呼び出してデータ バインディングを実行し、データ バインディング式を解決する必要があります。
もう 1 つの状況は、データ バインド コントロールのデータを手動で更新する必要がある場合です。同じデータベースから情報を表示する 2 つのコントロールを含むページがあるとします。おそらく個別のビューを使用しています。この場合、データ表示の同期を維持するために明示的にデータにコントロールを再バインドする必要があります。たとえば、製品の一覧を表示する GridView コントロールおよびユーザーが製品を個々に編集するための DetailsView コントロールがあるとします。GridView コントロールと DetailsView コントロールは同じソースからデータを表示しますが、異なるクエリを使用してデータを取得しているので、別のデータ ソース コントロールにバインドされています。ユーザーが DetailsView コントロールを使用してレコードを更新すると、関連付けられているデータ ソース コントロールによって更新処理が実行されます。ただし、GridView コントロールは、別のデータ ソース コントロールにバインドされているので、ページが更新されるまで古いレコードの値が表示されます。そこで、DetailsView コントロールがデータを更新した後に、DataBind メソッドを呼び出します。これによって、<%# デリミタと %> デリミタの間のすべてのデータ バインディング式およびパブリックにスコープされたコードが再実行され、GridView コントロールのビューが更新されます。その結果、GridView コントロールに DetailsView コントロールによる更新内容が反映されます。
ルックアップ テーブルへのバインディングの使用
データ バインド コントロールは、ユーザーが DropDownList コントロールまたは他のリスト コントロールを使用し、ルックアップ テーブルから選択して値を更新または挿入できるようにする場合によく使用されます。この場合、ルックアップ コントロールは、可能な値の一覧を返す個別のデータ ソースにバインドされます。またルックアップ コントロールの選択した値は、親データ バインドの行のフィールドにバインドされます。
この機能は次の手順で追加できます。まず、ルックアップ コントロールについて、リスト コントロール (DropDownList コントロールまたは ListBox コントロール) をデータ バインド コントロール (GridView、DetailsView、FormView などの各コントロール) のテンプレートに追加します。ルックアップ コントロールの SelectedValue プロパティは、コンテナ コントロールのデータ ソースにある関連フィールドにバインドします。次に、ルックアップ コントロールの DataSourceID プロパティを、ルックアップ値を取得するデータ ソース コントロールに設定します。ルックアップ コントロールの DataTextField プロパティは、表示する値を含むルックアップ テーブルのフィールドに設定します。また、適用できる場合、DataValueField プロパティは、ルックアップ値の固有な識別子を含むルックアップ テーブルのフィールドに設定します。
次のコード例は、FormView コントロールの InsertItemTemplate テンプレートに含まれる DropDownList コントロールです (これは、DetailsView コントロールの Fields プロパティまたは GridView コントロールの Columns プロパティに含まれる、TemplateField の InsertItemTemplate テンプレートの可能性もあります)。DropDownList コントロールの SelectedValue プロパティは、Bind メソッドを使用して、FormView コントロールの現在の行の CategoryID フィールドに双方向にバインディングします。DataSourceID コントロールの DropDownList プロパティは、可能なカテゴリ名と ID の一覧を取得する個別のデータ ソース コントロールに設定されます。DropDownList コントロールの DataTextField プロパティは、可能なカテゴリ名が表示されるように、ルックアップ データ ソースの CategoryName フィールドに設定されます。DropDownList コントロールの DataValueField プロパティは、関連するカテゴリ名のルックアップ データ ソースの CategoryID フィールドに設定されます。ユーザーがリストからカテゴリ名を選択すると、DropDownList コントロールの SelectedValue プロパティは、選択したカテゴリ名のカテゴリ ID に設定されます。
VBC#C++F#JScript
コピー<tr>
  <td align="right"><b>Category:</b></td>
  <td><asp:DropDownList ID="InsertCategoryDropDownList"
                        SelectedValue='<%# Bind("CategoryID") %>'
                        DataSourceID="CategoriesDataSource"
                        DataTextField="CategoryName"
                        DataValueField="CategoryID"
                        RunAt="Server" />
  </td>
</tr>

同じリスト コントロールを編集項目のテンプレートにも使用できます。

DataSource紹介 ー概略

データ ソース コントロール  説明 
ObjectDataSource
 ビジネス オブジェクトまたはその他のクラスと共に使用し、中間層オブジェクトに依存する Web アプリケーションを作成してデータを管理します。
詳細については、「ObjectDataSource Web サーバー コントロール」を参照してください。

SqlDataSource
 Microsoft SQL Server、OLE DB、ODBC、または Oracle データベースへのアクセスを提供する ADO.NET マネージ データ プロバイダを使用できます。
詳細については、「SqlDataSource Web サーバー コントロール」を参照してください。

AccessDataSource
 Microsoft Access データベースで使用できます。
詳細については、「AccessDataSource Web サーバー コントロール」を参照してください。

XmlDataSource
 TreeView コントロール、Menu コントロールなどの階層的な ASP.NET サーバー コントロールで特に有効な XML ファイルを使用できます。
詳細については、「XmlDataSource Web サーバー コントロール」を参照してください。

SiteMapDataSource
 ASP.NET サイト ナビゲーションで使用します。詳細については、「ASP.NET サイト ナビゲーションの概要」を参照してください。

DataSource紹介 - ObjectDataSource

ObjectDataSourceは中間層ビジネス オブジェクトとして扱うのは普通です。
使う前に、対応ビジネスオブジェクトが必要です。
例:
===============
 Namespace Samples.DataSources
  Public Class TestObjectDataSource
    ' Select all employees.
    Public Function GetTestData(key as string) As DataTable
     return new DataTable
    End Function
   
    public Function Update(dt as DataTable) as Integer
     '更新
     return 0
    End Function
   
    public Function Delete(dt as DataTable) as Integer
     '削除
     return 0
    End Function
 End Class
End Namespace
===============

<html>
 <asp:ObjectDataSource
        ID="TestObjectDataSource1"
        runat="server"
        TypeName="Samples.DataSources.TestObjectDataSource"
        EnablePaging="true"
        SelectCountMethod="SelectCount"
        StartRowIndexParameterName="StartRecord"
        MaximumRowsParameterName="MaxRecords"
        SelectMethod="GetTestData" >
      </asp:ObjectDataSource>
 <asp:GridView ID="EmployeesGridView"
              DataSourceID="TestObjectDataSource1" >
 </asp:GridView>
</html>

2010年12月8日星期三

组织的力量

成大事者必然存在于某个组织,脱离了组织,个人什么都不是。
个人在组织中的位置越高,影响力就越强,个人可以发挥能力就越强。

组织的力量,取决于领导的能力。
领导代表权利,更代表义务。

如何成为领导,首先考虑成为组织的一员,成为组织成员的目的是什么。
健康的组织,像阳光普照每一个角落。
作为一名新人,如何最快速的成为组织中的领头羊,是学习的意识和能力。

新闻-中国民间发明家发明致穷-读后感

从网上看到的[民间发明家发明致穷]这篇报道, 让我突发奇想,从这篇报道里,
我看到了一个项目。

1 是否能够将专利统一管理,建立市场,公开销售/竞售。
2 如何收集专利,与发明人取得联系并长期合作。
3 如何鉴别专利的真假。
4 如何评价专利的市场价值。
5 如何调节专利提供者与需求者之间的关系。
6 是否能够提供一种先有需求后搞发明的服务模式。
7 是否有启动资金,启动平台,是否有时间。
8 是否能够找到总负责本项目的合适人选,及其他相关角色的人选。
9 如何能让思想不半途而废。


新闻提到了美国日本的发明专利转化率高达80%,中国的不到5%.
说明一个严重的问题是国家的发明专利机构不作为,只负责登记,其他一概不问。
我们是否能够模拟专利组织,处理所有专利组织不作为的部分,
就是评估专利,专利推广等上面提到的问题。

题外话:
金融业: 支付宝虽然不是银行,却做到了银行的本质。
物流业: 已经不再是邮局的天下。
那么还有哪些衙门还有哪些地方不作为,可以为我们小老百姓创造就业机会的呢。
本人联系方式lqwangxg@gmail.com. 对讨论创业感兴趣的,可以做个朋友。
———————————————————————————————————
机会就在每一天。

2010年12月1日星期三

.net Control継承にToolboxBitmap利用

VS IDE(VS2008等)の Toolboxに既存しているControlを継承して、新たなControlを作る時に、
継承ControlのBitmapはディフォルトの◎で表示されています。
親のBitmapを表示させる方法があります。
以下例のようにToolboxBitmapの属性を使えば簡単にできる:
C#
[ToolboxBitmap(typeof(TextBox))]
public class CurrencyTextBox : TextBox, IScriptControl, IValidator, IIsRequired
{
...
}

=============================================
VB.net
<ToolboxBitmap(GetType(TextBox))> _
Public Class CurrencyTextBox
    Inherits TextBox
    Implements IScriptControl, IValidator, IIsRequired
 ...
End Class