RadGrid + LinqDatasource筆記

  • 5579
  • 0
  • 2011-09-20

RadGrid + LinqDatasource筆記

Q1.如何在RadGrid設定嵌入式的編輯視窗?如下圖所示

image

1.先準備一個使用者控制項(EditProductKeyword.ascx檔)

2.在RadGrid <MasterTableView> 下面新增以下設定要顯示的ascx(使用者控制項)

        <EditFormSettingsUserControlName="EditProductKeyword.ascx"EditFormType="WebUserControl">
                    <
EditColumnUniqueName
="EditCommandColumn1">
                    </
EditColumn
>
        </
EditFormSettings>


3.在RadGrid的<Columns>最後加入一個編輯的欄位

                  </telerik:GridEditCommandColumn>

4.在使用者控制項的cs檔,加入以下方法,DataItem就是grid裏每一列的資料

        {
            InitializeComponent();
            base.OnInit(e);
        }

        private void InitializeComponent()
        {
            this.DataBinding += new System.EventHandler(this.ProductKeywordDetails_DataBinding);

        }

        public object DataItem
        {
            get
            {
                return this._dataItem;
            }
            set
            {
                this._dataItem = value;
            }
        }

        protected void ProductKeywordDetails_DataBinding(object sender, System.EventArgs e)
        {
            var item = DataItem as Products4;
                      
        }
                onclick="btnSave_Click" />
            <asp:Button ID="btnCancel" Text="取消"  runat="server" CausesValidation="False" CommandName="Cancel"></asp:Button>
 


Q2.如何讓grid使用jquery 的效果?

a.使用RadCodBlock,放入當ajax更新後,要執行的jquery程式

        <script type="text/javascript">
            function OnResponseEnd(sender, args) {
                $("img[title].restult").tooltip();
            }
        </script>
    </telerik:RadCodeBlock>

 

        <ClientEvents OnResponseEnd="OnResponseEnd"></ClientEvents>
</telerik:RadAjaxManager>

Q3 如何讓RedGrid出現checkbox,取得使用者勾選?

image

1.在radgrid的columns底下加入一個欄位, 這個欄位顯示出來就是上圖的checkbox:

     <telerik:GridClientSelectColumn FilterControlAltText="Filter check column" HeaderText="審核"
     UniqueName="check">
     </telerik:GridClientSelectColumn>
</Columns>

2.在任何事件中,透過radgrid.selectedItems取得選取的鍵值

foreach(varp inRadGrid1.SelectedIndexes)
{
                   varv = ((GridDataItem)RadGrid1.SelectedItems[i]).GetDataKeyValue("ProductId");
                   intprodId = Convert.ToInt32(v);
                   i++;
}

Q4 如何讓RadGrid可以多選?

            GridLines="None" PageSize="4" AllowMultiRowSelection="True" DataSourceID="dsProduct4NoCheck">

 

Q5 一個RadGrid要動態切換到多個schema的table,該如何做?

不要用linqdatasource的tablename來切。而是要拉出多個linqdatasource, 而radgrid不要有預設的datasource, 當有切換動作時,直接切換radgrid的datasourceId

 

Q6 LinqDatasource的where 條件,想要用到像sql 的select * from a where id not in (select id from b),該怎麼做?

1.先要在DataContext裏面a table 與 b table 建好關聯

image

2.建好關聯後, a table 裏面就多了b table屬性(上圖的ProductsAICheck),此時LinqDatasource的where 屬性可以這樣寫 ProductsAICheck.Count() == 0(代表sql 語法的not in b)

 

Q7使用LinqDataSource有時候非常慢,為什麼?該如何解決?

如果你已經動態指定Radgrid的Datasource了,那麼千萬記得,把aspx裏面RadGrid的DatasourceID拿掉,否則會”隱性”的多綁定一次,也就是會多撈一次資料,造成速度變慢。

Q8如何讓RadGrid支援彈出式視窗(另一頁)?

參考資料:http://demos.telerik.com/aspnet-ajax/grid/examples/dataediting/popupeditform/defaultcs.aspx

checkrelate.savebar.com.tw

RadControl有一個RadWindowManager控件可以搭配RadGrid使用,用法如下:

a.RadGrid.EditMode屬性設為popup

b.Aspx-加入RadWindowManager

<telerik:RadWindowManagerID="RadWindowManager1"runat="server"EnableShadow="true"> <Windows>
                <
telerik:RadWindowID="UserListDialog"runat="server"Title="Editing record"Height
="600px"
                  
Width="860px"Left="150px"ReloadOnShow="true"ShowContentDuringLoad="false"Modal
="true" />
            </
Windows
>
</
telerik:RadWindowManager
>

c.放入javascript程式在RadCodeBlock , 紫色部份改成你要彈出的新頁url, id 會是radgrid中的key值

        <script type="text/javascript">
           function ShowEditForm(id, rowIndex) {
                var grid = $find("<%= RadGrid1.ClientID %>");

                var rowControl = grid.get_masterTableView().get_dataItems()[rowIndex].get_element();
                grid.get_masterTableView().selectItem(rowControl, true);

                window.radopen("EditProductReleation.aspx?PrdId=" + id, "UserListDialog");
                return false;
            }
         </script>
    </telerik:RadCodeBlock>
d.在RadGrid的Columns裏面,放入編輯的HyperLink程式碼:
<telerik:GridTemplateColumn UniqueName="TemplateEditColumn">
                        <HeaderStyle Width="40" />
                        <ItemTemplate>
                            <asp:HyperLink ID="EditLink" runat="server" Text="編輯"></asp:HyperLink>
                        </ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>

e.在RadGrid的ItemCreated事件中,動態設定上述HyperLink的onclick事件,讓它呼叫ShowEditForm() js code,並傳入該列的key值

{
            if (e.Item is GridDataItem)
            {
                HyperLink editLink = (HyperLink)e.Item.FindControl("EditLink");
                editLink.Attributes["href"] = "#";
                editLink.Attributes["onclick"] = String.Format("return ShowEditForm('{0}','{1}');", e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["ProductId"], e.Item.ItemIndex);
            }
}

f.在彈出頁的aspx,預先放好關閉的 jsCode CancelEdit()

<script type="text/javascript">

        function GetRadWindow()

            var oWindow = null;
            if (window.radWindow) oWindow = window.radWindow; //Will work in Moz in all cases, including clasic dialog
            else if (window.frameElement.radWindow) oWindow = window.frameElement.radWindow; //IE (and Moz as well)
            return oWindow;
        }

        function CancelEdit()
            GetRadWindow().close();
        }
</script>

g.在新頁(彈出的aspx)的關閉按鈕事件中,新增以下jsCode,把彈出的視窗關掉