将字符串[]渲染为一系列可编辑的控件?

时间:2009-08-25 18:36:12

标签: asp.net dynamic formatting string

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

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

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

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

有人可以分享一种优雅的方式吗?

3 个答案:

答案 0 :(得分:1)

我首先要说的是,从用户界面的角度来看,我并不完全确定你为什么需要这样做,但是如果必须这样做,你就会按照以下方式做点什么: / p>

  • 从字符串[]
  • 开始
  • 创建List<List<string>>
  • 循环播放原始数组,将字符串添加到新的List<string>
  • 在达到所需的总字符长度后,将List<string>添加到List<List<string>>(包含您的行)
  • 重复这些步骤,直到完成原始数组

完成此操作后,您将列表列表绑定到如下所示的转发器(伪代码;可能稍微偏离):

<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>

答案 1 :(得分:1)

您正在寻找的魔力是“满足”属性。适用于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,以确保它们不会添加回车或空格或者您不希望它们放入的任何内容......但这是基本的想法。< / p>

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

答案 2 :(得分:0)

我能想到接近这样的事情的最好方法就是简单地使用转发器并将所有东西都悬浮起来。

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