【问题标题】:Render a string[] as a series of editable controls?将字符串 [] 渲染为一系列可编辑控件?
【发布时间】:2009-08-26 03:22:12
【问题描述】:

我有一个字符串[],其中包含从一段文本中解析出来的单个单词。我需要在自己的单元格中显示每个单词,并根据单词的长度为每个单元格分配一个动态宽度。我希望能够在每行的最大宽度内包含尽可能多的单词。

简而言之,我正在尝试获取给定的文本段落并将其呈现为一系列可编辑控件,其方式类似于它可能显示为纯文本文档的方式,每个单词仅占用其所需的空间每一“行”。

我首先尝试在 Table 模式下使用带有 RepeatLayout 的 DataList,并将 RepeatColumns 设置为 10,其中的 Repeater 包含一个 Label 控件;这导致每行 10 个单词,但每个单元格的宽度是固定的。

我考虑过使用带有单列的 GridView,我会在每行中填入尽可能多的单词(以标签控件的形式),并根据需要添加新行,直到构建整个段落。

谁能分享一个优雅的方法来做到这一点?

【问题讨论】:

    标签: asp.net dynamic formatting string


    【解决方案1】:

    您正在寻找的魔法是“contenteditable”属性。适用于 IE、Firefox 和 Chrome。

    我不确定你到底在用这个做什么,lmao...但这应该可以工作:

    你的代码背后:

    protected void Page_Load(object sender, EventArgs e)
    {
        //creating some bogus collection of strings.
        string[] parts = { "this", "is", "a", "test", "of", "the", "goofiest", "ui", "ever" };
        //bind it to the repeater.
        rptr.DataSource = parts;
        rptr.DataBind();
        //now we'll add them to a JavaScript array we can access client side.
        StringBuilder sb = new StringBuilder();
        sb.Append("document.stringItems = new Array();");
        for (int i = 0; i < parts.Length; i++)
            sb.AppendFormat("document.stringItems[{0}] = '{1}';", i, parts[i]);
        ScriptManager.RegisterClientScriptBlock(this, GetType(), "someKey", sb.ToString(), true);
    }
    protected void btnTest_Click(object sender, EventArgs e)
    {
        //display the result just so we can see it's working.
        lblResult.Text = hdnResult.Value;
    }
    

    您的 .ASPX:

    <asp:Repeater ID="rptr" runat="server">
        <ItemTemplate>
            <span contenteditable="true" style="border: solid 1px;" onkeyup="updateItem(event, <%#Container.ItemIndex%>)">
                <%#Container.DataItem%></span>
        </ItemTemplate>
    </asp:Repeater>
    <asp:HiddenField ID="hdnResult" runat="server" />
    <asp:Button ID="btnTest" runat="server" Text="Test" OnClick="btnTest_Click" />
    <script type="text/javascript" language="javascript">
        //<![CDATA[
        function updateItem(e, index) {
            //get the source element. (magic here for cross browser lameness)
            var src;
            if(window.event) {
                e = window.event;
                src = e.srcElement;
            }else{
                src = e.target;
            }
            //update our item in our array.
            document.stringItems[index] = src.innerHTML;
            //update our hidden field.
            var s = '';
            var space = false;
            for (var i = 0; i < document.stringItems.length; i++) {
                if (space)
                    s += ' ';
                else
                    space = true;
                s += document.stringItems[i];
            }
            var hdnResult = document.getElementById('<%=hdnResult.ClientID%>');
            hdnResult.value = s;
        }
        //]]>
    </script>
    <asp:Label ID="lblResult" runat="server"></asp:Label>
    

    您还必须为 onkeypress 添加一些 javascript,以确保它们没有添加回车符或空格或您不希望它们放入的任何内容...但这是基本思想。

    我希望这会有所帮助。祝你好运。

    【讨论】:

      【解决方案2】:

      我首先要说的是,从用户界面的角度来看,我不完全确定您为什么需要这样做,但如果必须这样做,您会按照以下方式做一些事情:

      • 从你的字符串开始[]
      • 创建List&lt;List&lt;string&gt;&gt;
      • 循环遍历原始数组,将字符串添加到新的List&lt;string&gt;
      • 达到所需的总字符长度后,将 List&lt;string&gt; 添加到您的 List&lt;List&lt;string&gt;&gt;(其中包含您的行)
      • 重复这些步骤,直到完成原始阵列

      完成此操作后,您将 list o' list 绑定到如下所示的转发器(伪代码;可能有点偏离):

      <asp:Repeater id="rpt1" runat="server">
      <ItemTemplate>
        <div>
          <asp:Repeater id="rpt2" runat="server" DataSource='<%# Container.DataItem %>'>
          <ItemTemplate>
             <asp:TextBox id="txt1" runat="server" Text='<%# Container.DataItem %>' Width='<%# MyWidthAlgorithm(Container.DataItem) %>'
          </ItemTemplate>
          </asp:Repeater>
        </div>
      </ItemTemplate>
      </asp:Repeater>
      

      【讨论】:

      • 它与我正在处理的一个项目有关,该项目依赖于能够分解一段文本,以便可以单独操作和编辑其单词。有点像基于网络的记事本,除了每个单词都被视为不仅仅是一个字符串。
      【解决方案3】:

      我能想到的解决此类问题的最佳方法是简单地使用中继器并浮动所有剩余的东西。

      <asp:Repeater runat="server" id="rptr">
         <ItemTemplate>
            <span style="float:left; height:22px; line-height:22px;"><%# Eval("Word") %></span>
         </ItemTemplate>
      </asp:Repeater>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多