DataGrid的拖動+浮動提示

呵呵,好久沒更新了。

前兩個星期,都在試著將DataGrid變成可以拖動,並可以添加多表頭的樣子。拖動的可以了,多表頭用最笨的辦法也實現了,但是多表頭並可以拖動卻沒有實現,比如,添加二級表頭後,只有第一行表頭可以拖動,第二行卻不行。但是其間,我也是獲益頗多。

1.      可以將一些鼠標等事件用JavaScript寫到一個.htc的文件,然後使用下列方法(BEHAVIOR)調用:

(1) 方法一:

<asp:DataGrid ID="DataGrid1" runat="server" Style="behavior: url(draggrid.htc)">

</asp:DataGrid>

(2)方法二:

<style type="text/css">

        .MoveDgd { BEHAVIOR: url(movegrid.htc)}

</style>

<asp:DataGrid ID="dgdMain" CssClass="MoveDgd" runat="server">

2.      鼠標移動到單元格上方時出現浮動提示:由於DataGrid可以拖動了,所以單元格的寬度就是個問題了。目標是:當單元格內的字符寬度(不是長度Length)大於單元格的寬度時,隱藏多餘的字符,並且使用省略號代替,而且,當鼠標移動到DataGrid的某個單元格的上方時,如果單元格內的字符寬度(不是長度Length)大於單元格的寬度,則將完整內容作為提示顯示出來。

(1) 在網上查找相關資料,發現原來使用CSS樣式就可以實現了。

<style type="text/css">

        . TextOver { text-overflow:ellipsis; overflow:hidden; white-space: nowrap; padding:2px; width:80% }

</style>

其中,TextOver為自定義的標識符。

這句是說當字符串的寬度超過單元格寬度的80%的時候,就以省略號顯示多出部分。

然後在申明DataGrid的時候指定該樣式:

<asp:DataGrid ID="DataGrid1" runat="server" CssClass="TextOver">

</asp:DataGrid>

(2) 這個方法對英文字母和數字都可以達到要求,但是對漢字就不能達到預期的效果,於是繼續上網淘寶,發現了一段javascript可以實現:

<script language="javascript">

function changeTitle(obj)

        {

            if(obj.offsetWidth > obj.parentElement.offsetWidth)

            {

                obj.title = obj.innerText;

            }

            else

            {

                obj.title = "";

            }

    }

</script>

 但是,方法中判斷obj.offsetWidth > obj.parentElement.offsetWidth,但是直接使用的話,obj就是td了,那麼obj.parentElement當然就是table了,所以這個條件總是不成立的,也就不會顯示提示咯。

 於是,我拼命的找資料,該怎麼得到這些字符串的寬度,可惜的是,我奮鬥了好久,都沒有找到任何可行的方法,沒辦法,看來這樣子是行不通的,只好換個方法。

         所以我得在td的外面加一層標簽<div></div>這樣的話,當td中的字符串寬度超過td的寬度的時候,就能夠顯示提示了。試了下,居然通過。

        首先,在DataGridItemDataBound()事件中為表頭外的所有單元格添加CssClass樣式TextOver

      protected void dgdMain_ItemDataBound(object sender, DataGridItemEventArgs e)

          {

               if (e.Item.ItemType == ListItemType.Header)

               {

 

               }

               else

               {

                    for (int i = 0; i < e.Item.Cells.Count; i++)

                    {

                         e.Item.Cells[i].Attributes.Add("class", "TextOver");

                    }

               }

     }

    然後,在填充DataGrid的時候,為td添加Div層:

  public void FillDBGridFromDataSet(ref DataGrid DBGTemp, DataSet dstADO)

          {

              for (int intRow = 0; intRow <= dstADO.Tables[0].Rows.Count - 1; intRow++)

              {

                  for (int intCol = 0; intCol <= DBGTemp.Columns.Count - 1; intCol++)

                  {

    string[] strDBFieldNameWithCellType = DBGTemp.Columns[intCol].FooterText.Split('/u000F');

    string strDBFieldName = strDBFieldNameWithCellType[0];//欄位名稱

    string strCellType = strDBFieldNameWithCellType[1];   //欄位型態

    string strFieldType = strDBFieldNameWithCellType[2];  //按鈕型態 LinkButton || PushButton

    int intDec = Int32.Parse(strDBFieldNameWithCellType[3]);//幣別小數位

    if (strCellType == "1")      //CheckBox

    {

    }

    else if (strCellType == "3")      //DataTime

    {

         …….

    }

    else if (strCellType == "4")      //Numeric

    {

       ………

    }

    else if (strCellType == "5")     //5.String 型態

    {

        if (FindDBColumn(dstADO, strDBFieldName))

        {

                           DBGTemp.Items[intRow].Cells[intCol].Text = dstADO.Tables[0].Rows[intRow][strDBFieldName].ToString();

/***************************************************************************************

 * Desc:在單元格<td></td>中添加一層<div></div>標簽

 * 目的:註冊onmouseover的事件,

 *       用以判斷單元格內字符串的寬度是否大於td的寬度(隱藏多餘的字符並以...表示,並顯示浮動提示)

****************************************************************************************/

                            string strDivStart = "<div style=/"white-space: nowrap;/" title=/"/" οnmοuseοver=/"changeTitle(this)/">";

                            string strDivEnd = "</div>";

                            string strTd = DBGTemp.Items[intRow].Cells[intCol].Text;

                            DBGTemp.Items[intRow].Cells[intCol].Controls.Add(new LiteralControl(strDivStart + strTd + strDivEnd));

                        }

                    }

                    else if (strCellType == "6")                         //6.COMBOBOX型態

                    {

                        ………

                    }

                    else if (strCellType == "7")                         //Currency型態

                    {

                        ………

                    }

                    else if (strCellType == "8")                       //LinkButton

                    {

                        ………

                    }

                    else if (strCellType == "9")                      //PushButton

                    {

                        ………

                    }

                }

            }

   }

呵呵,又學了一招,原來MicroSoft給我們提供了這麼多類可以使用,比如,我現在用到的添加標簽:

 string strDivStart = "<div style=/"white-space: nowrap;/" title=/"/" οnmοuseοver=/"changeTitle(this)/">";

                            string strDivEnd = "</div>";

                            string strTd = DBGTemp.Items[intRow].Cells[intCol].Text;

                            DBGTemp.Items[intRow].Cells[intCol].Controls.Add(new LiteralControl(strDivStart + strTd + strDivEnd));

這裏,用到的是LiteralControl,它表示 HTML 元素、文本和 ASP.NET 頁中不需要在服務器上處理的任何其他字符串。

3.      先就這麼多吧,週末愉快!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章